home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / gfx / fract / FlashMandel.lha / Sources / FlashMandel.c < prev    next >
C/C++ Source or Header  |  2000-11-18  |  132KB  |  3,934 lines

  1. /*******************************************************************************
  2. **
  3. **  Coded by Dino Papararo              18-November-2000
  4. **
  5. *******************************************************************************/
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <math.h>
  10. #include <exec/exec.h>
  11. #include <clib/alib_protos.h>
  12. #include <intuition/intuition.h>
  13. #include <intuition/gadgetclass.h>
  14. #include <graphics/gfxbase.h>
  15. #include <graphics/scale.h>
  16. #include <devices/printer.h>
  17. #include <workbench/workbench.h>
  18. #include <iffp/ilbmapp.h>
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21. #include <proto/intuition.h>
  22. #include <proto/diskfont.h>
  23. #include <proto/graphics.h>
  24. #include <proto/gadtools.h>
  25. #include <proto/utility.h>
  26. #include <proto/iffparse.h>
  27. #include <proto/icon.h>
  28. #include <proto/asl.h>
  29. #include <proto/wb.h>
  30.  
  31. #include "compilerspecific.h"
  32.  
  33. #define Lib_Version 39L
  34.  
  35. #define FPU_68K 1L << 1
  36.  
  37. #ifndef AFF_68060
  38. #define AFF_68060 1L << 7
  39. #endif
  40.  
  41. #define VERSION  "FlashMandel 1.8 "
  42. #define AUTHOR   "Dino Papararo"
  43. #define COPYRIGHT "©1996-2000"
  44. #define ADDRESS  "Via Manzoni, 184\n  80123 Napoli\n  Italia"
  45. #define EMAIL    "E-Mail address:\n  DinoP@IName.Com\n\n"
  46.  
  47. #ifdef  __SASC
  48. #define DATE     __AMIGADATE__
  49. #else
  50. #define DATE     __DATE__
  51. #endif
  52.  
  53. #define INIT_DEF_RMIN      -2.0
  54. #define INIT_DEF_RMAX      +2.0
  55. #define INIT_DEF_IMIN      -1.5
  56. #define INIT_DEF_IMAX      +1.5
  57. #define INIT_DEF_RMINSTR   "-2.0"
  58. #define INIT_DEF_RMAXSTR   "+2.0"
  59. #define INIT_DEF_IMINSTR   "-1.5"
  60. #define INIT_DEF_IMAXSTR   "+1.5"
  61. #define INIT_DEF_JKRE      -0.72
  62. #define INIT_DEF_JKIM      -0.26
  63. #define INIT_DEF_JKRESTR   "-0.72"
  64. #define INIT_DEF_JKIMSTR   "-0.26"
  65.  
  66. #define DEF_WIDTH        640
  67. #define DEF_HEIGHT       480
  68. #define DEF_DEPTH        4
  69. #define DEF_MONITOR      0x50011000
  70. #define DEF_MONITORSTR  "0x50011000"
  71. #define DEF_FONTNAME    "topaz.font"
  72. #define DEF_FONTSIZE     8
  73. #define DEF_STARTPRI    -3
  74.  
  75. #define MIN_WIDTH  640
  76. #define MIN_HEIGHT 480
  77. #define MAX_WIDTH  16368
  78. #define MAX_HEIGHT 16384
  79. #define MIN_DEPTH  3
  80. #define MAX_DEPTH  8
  81.  
  82. #define MAX_FONTSIZE 24
  83. #define MIN_FONTSIZE 8
  84.  
  85. #define MIN_ITERATIONS 31
  86.  
  87. #define RESERVED_PENS 4L
  88.  
  89. #define TOBLACK   1
  90. #define FROMBLACK 0
  91.  
  92. #define RAW_ESC      0x045
  93. #define VAN_ESC      0x01B
  94. #define TAB          0x042
  95.  
  96. #define MINLIMIT 2
  97.  
  98. #define BLACK      (0)
  99. #define LIGHT_GREY (2)
  100. #define WHITE      (1)
  101. #define DARK_GREY  (3)
  102.  
  103. #define POINTS       4
  104. #define PAIRS        5
  105.  
  106. #define ONESEC        (50L * 1L)
  107. #define TWOSECS       (50L * 2L) /* 2 secondi */
  108.  
  109. #define SHIFTRIGHT   FALSE
  110. #define SHIFTLEFT    TRUE
  111.  
  112. #define INITIALZOOM  18
  113.  
  114. #define CLEAR_POINTER 0
  115. #define BUSY_POINTER  1
  116. #define ZOOM_POINTER  2
  117.  
  118. #define ZPW          15
  119. #define ZPH          15
  120. #define ZPXO         -8
  121. #define ZPYO         -7
  122.  
  123. #define MAXCHARS     20
  124.  
  125. #define ACCEPT       (1)
  126. #define RATIO        (2)
  127. #define RESET        (3)
  128. #define CANCEL       (4)
  129. #define KEEP         (5)
  130.  
  131. #define WMASK  0x1
  132. #define FMASK  0x2
  133. #define VMASK  0x4
  134. #define SMASK  0x8
  135. #define BMASK  0x10
  136. #define ZMASK  0x20
  137. #define TMASK  0x40
  138. #define MMASK  0x80
  139. #define LMASK  0x100
  140.  
  141. #define SPREAD_BIT   (1L << 16)
  142. #define REPEATED_BIT (1L << 17)
  143. #define TRUE_BIT     (1L << 18)
  144. #define INTEGER_BIT  (1L << 19)
  145. #define TITLE_BIT    (1L << 20)
  146. #define REAL_BIT     (1L << 21)
  147. #define PPC_BIT      (1L << 22)
  148. #define JULIA_BIT    (1L << 23)
  149.  
  150. #define LOADPICTURE_MSG 0x1
  151. #define SAVEPICTURE_MSG 0x2
  152. #define DUMP_MSG        0x4
  153. #define REDRAW_MSG      0x8
  154. #define UNDO_MSG        0x10
  155. #define DRAW_MSG        0x20
  156. #define PREVIEW_MSG     0x40
  157. #define NEWDISPLAY_MSG  0x80
  158. #define STOP_MSG        0x100
  159. #define EXIT_MSG        0x200
  160. #define COORDS_MSG      0x400
  161. #define ITER_MSG        0x800
  162. #define ABOUT_MSG       0x1000
  163. #define TITLE_MSG       0x2000
  164. #define TIME_MSG        0x4000
  165. #define PALETTE_MSG     0x8000
  166. #define CYCLERIGHT_MSG  0x10000
  167. #define CYCLELEFT_MSG   0x20000
  168. #define DELAY_MSG       0x40000
  169. #define COLOR_MSG       0x80000
  170. #define LOADPALETTE_MSG 0x100000
  171. #define SAVEPALETTE_MSG 0x200000
  172. #define FONTREQ_MSG     0x400000
  173.  
  174. #define PICTURES_DRAWER 0
  175. #define PALETTES_DRAWER 1
  176.  
  177. #define IDCMP_STANDARD  IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_MENUPICK
  178.  
  179. #define WFLG_STANDARD WFLG_ACTIVATE|WFLG_BACKDROP|WFLG_NOCAREREFRESH|WFLG_SMART_REFRESH|WFLG_BORDERLESS|WFLG_REPORTMOUSE|WFLG_NEWLOOKMENUS
  180.  
  181. #define TEXT_ALERT_POS  "\x00\x90\x10 FlashMandel message: "
  182.  
  183. #define MODE_ID_MASK (LACE|HIRES|HAM|EXTRA_HALFBRITE)
  184.  
  185. #define ID_MAND MAKE_ID ('M','A','N','D')
  186.  
  187. struct MandelChunk { WORD LeftEdge,TopEdge,Width,Height;
  188.                      DOUBLE RMin,RMax,IMin,IMax;
  189.                      DOUBLE RConst,IConst;
  190.                      ULONG Iterations;
  191.                      ULONG Special;
  192.                    };
  193.  
  194. struct MandelChunk MANDChunk = {0},*MANDChunkTmp = NULL;
  195.  
  196. struct RastPort TempRP;
  197.  
  198. struct BitMap *TempBM;
  199.  
  200. UBYTE *PixelLine;
  201.  
  202. TEXT VERSION_STRING [] = "\0$VER: " VERSION " " COPYRIGHT " by " AUTHOR " compiled in " DATE "\0";
  203.  
  204. TEXT MYFILE [30],PICTURESDIR [230],PALETTESDIR [230],MYPATH [260],BAR_STRING [80],*MYDIR = NULL;
  205.  
  206. BOOL JULIA = FALSE,DEPTH_CHANGED;
  207.  
  208. WORD ZOOMLINE [PAIRS << 1] , MAX_ITERATIONS = 319,RETURNVALUE = 0;
  209.  
  210. UWORD ITERATIONS;
  211.  
  212. LONG PRIORITY = DEF_STARTPRI,DELAY = 5L,__oslibversion = Lib_Version;
  213.  
  214. ULONG MASK = TMASK;
  215.  
  216. ULONG ELAPSEDTIME = NULL,CURRENT_MAX_COLORS;
  217.  
  218. double RMIN=INIT_DEF_RMIN,RMAX=INIT_DEF_RMAX,IMIN=INIT_DEF_IMIN,IMAX=INIT_DEF_IMAX;
  219.  
  220. double DEF_RMIN,DEF_RMAX,DEF_IMIN,DEF_IMAX,DEF_JKRE=INIT_DEF_JKRE,DEF_JKIM=INIT_DEF_JKIM,URMIN=0.0,URMAX=0.0,UIMIN=0.0,UIMAX=0.0,UJKRE=0.0,UJKIM=0.0;
  221.  
  222. double FACTOR=0.0,INCREMREAL=0.0,INCREMIMAG=0.0,CRE=0.0,CIM=0.0,JKRE=0.0,JKIM=0.0;
  223.  
  224. ULONG *PALETTE;
  225.  
  226. CPTR *VINFO = NULL;
  227.  
  228. VOID (*V_LINE) (struct RastPort *,const LONG,const LONG,const LONG);
  229.  
  230. VOID (*H_LINE) (struct RastPort *,const LONG,const LONG,const LONG);
  231.  
  232. UBYTE *DiskFontLibraryError   =  "I need at least DiskFontLibrary v39 or better, sorry !";
  233. UBYTE *IconLibraryError       =  "I need at least IconLibrary v39 or better, sorry !";
  234. UBYTE *GadToolsLibraryError   =  "I need at least GadToolsibrary v39 or better, sorry !";
  235. UBYTE *AslLibraryError        =  "I need at least AslLibrary v39 or better, sorry !";
  236. UBYTE *UtilityLibraryError    =  "I need at least UtilityLibrary v39 or better, sorry !";
  237. UBYTE *IFFParseLibraryError   =  "I need at least IFFParseLibrary v39 or better, sorry !";
  238. UBYTE *OpenDisplayError       =  "I need at least 8 colors, sorry.";
  239. UBYTE *NoMemForTempRastPort   =  "No mem for temp RastPort";
  240. UBYTE *FontError              =  "Font failed";
  241. UBYTE *NoMonitor              =  "No monitor";
  242. UBYTE *NoChips                =  "No chips";
  243. UBYTE *NoMem                  =  "No mem";
  244. UBYTE *NoChipMem              =  "No chipmem";
  245. UBYTE *PubNotUnique           =  "Pub not unique";
  246. UBYTE *UnknownMode            =  "Unknown mode";
  247. UBYTE *ScreenTooDeep          =  "Screen too deep";
  248. UBYTE *AttachScreen           =  "Attach screen failed";
  249. UBYTE *ModeNotAvailableError  =  "Mode not available";
  250. UBYTE *UnknownScrError        =  "Unknown screen error";
  251. UBYTE *VisualInfoError        =  "Visualinfo failed";
  252. UBYTE *WindowError            =  "Openwindow failed";
  253. UBYTE *MenuError              =  "Menu failed";
  254. UBYTE *GadgetError            =  "Gadget error";
  255. UBYTE *WindowGadgetError      =  "Window gadget error";
  256. UBYTE *PreviewWindowError     =  "Preview window failed";
  257. UBYTE *CreateDisplayError     =  "Createdisplay error";
  258. UBYTE *DimensionInfoError     =  "Dimensioninfo error";
  259. UBYTE *DisplayInfoError       =  "Displayinfo error";
  260. UBYTE *PaletteRequesterError  =  "Palette requester error";
  261. UBYTE *MakeDisplayError       =  "Display error";
  262. UBYTE *QueryMandPicError      =  "Not a FlashMandel picture !";
  263. UBYTE *LoadMandPicError       =  "Load picture error";
  264. UBYTE *SaveMandPicError       =  "Save picture error";
  265. UBYTE *LoadMandPalError       =  "Load palette error";
  266. UBYTE *SaveMandPalError       =  "Save palette error";
  267.  
  268. void   FreeBitMapSafety (struct BitMap *);
  269. BOOL   AllocTempRast (UWORD,UBYTE);
  270. void   PutPointer    (struct Window *,UWORD *,LONG,LONG,LONG,LONG,UBYTE);
  271. VOID   ClipIt        (WORD,WORD,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,BOOL);
  272. ULONG  ModeFallBack  (ULONG,WORD,WORD,WORD);
  273. LONG   About         (struct Window *);
  274. LONG   Choice        (struct Window *,TEXT *,TEXT *);
  275. LONG   CheckGFX      (VOID);
  276. UBYTE  GetMaxPlanes  (ULONG);
  277. void   AdjustRatio   (double *,double *,double *,double *,WORD,WORD,BOOL);
  278. VOID   ShowTime      (struct Window *,TEXT *,ULONG);
  279. ULONG  IntegerGad    (struct Window *,TEXT *,TEXT *,TEXT *,ULONG);
  280. VOID   CloseDisplay  (struct ILBMInfo *,CPTR *);
  281. LONG   MakeDisplay   (struct ILBMInfo *);
  282. void   JVLine        (struct RastPort *,const LONG,const LONG,const LONG);
  283. void   JHLine        (struct RastPort *,const LONG,const LONG,const LONG);
  284. void   MVLine        (struct RastPort *,const LONG,const LONG,const LONG);
  285. void   MHLine        (struct RastPort *,const LONG,const LONG,const LONG);
  286. BOOL   CheckBox      (struct RastPort *,const LONG,const LONG,const LONG,const LONG);
  287. BOOL   RectangleDraw (struct Window *,const LONG,const LONG,const LONG,const LONG);
  288. BOOL   NewCoords     (struct Window *,WORD,WORD,WORD,WORD);
  289. BOOL   DrawFrame     (struct Window *,WORD,WORD,WORD,WORD);
  290. ULONG  DrawFractal   (struct Window *,const LONG,const LONG,const LONG,const LONG);
  291. BOOL   Preview       (struct Window *,WORD,WORD);
  292. BOOL   ShowCoords    (struct Window *);
  293. void   RestoreCoords (struct Window *);
  294. void   SaveCoords    (struct Window *,BOOL);
  295. BOOL   FileRequest   (struct Window *,TEXT *,TEXT *,BOOL,BOOL);
  296. BOOL   FontRequest   (struct Window *);
  297. BOOL   SMRequest     (struct ILBMInfo *);
  298. VOID   SetMenuStart  (struct Window *);
  299. VOID   SetMenuStop   (struct Window *);
  300. ULONG  ProcessMenu   (struct Window *,UWORD);
  301. void   PickJuliaK    (struct Window *);
  302. void   ProcessMouse  (struct Window *,WORD,WORD);
  303. ULONG  HandleEvents  (struct ILBMInfo *);
  304. LONG   WinDump       (struct Window *);
  305. ULONG  Fail          (UBYTE *,ULONG);
  306. BOOL   PasteBitMap   (struct BitMap *,struct Window *,WORD,WORD);
  307. LONG   main          (LONG,CONST_STRPTR *);
  308.  
  309. static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *),REG (a2,struct ScreenModeRequester *),REG (a1,ULONG));
  310.  
  311. struct Screen *OpenIdScreen (struct ILBMInfo *,WORD,WORD,WORD,ULONG);
  312. struct Window *OpenDisplay  (struct ILBMInfo *,WORD,WORD,WORD,ULONG);
  313. struct BitMap *CopyBitMap   (struct Window *,WORD,WORD,WORD,WORD);
  314.  
  315. struct Hook         SMFILTERHOOK      = {NULL,NULL,(VOID *) SMFilterFunc,NULL};
  316.  
  317. struct Border       MYBORDER          = {0,0,0,0,COMPLEMENT,PAIRS,ZOOMLINE,0};
  318.  
  319. struct TextAttr     MYFONTSTRUCT      = {"topaz.font",8,FS_NORMAL,FPF_DISKFONT};
  320.  
  321. struct NewGadget    TEXTGAD           = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  322.  
  323. struct NewGadget    BUTTONGAD         = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  324.  
  325. struct NewGadget    CHECKBOXGAD       = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  326.  
  327. struct BitScaleArgs BSA               = {0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,0,0,NULL,NULL};
  328.  
  329. struct Chunk        COPYRIGHT_CHUNK   = {NULL,ID_ILBM,ID_Copyright,IFFSIZE_UNKNOWN,"\n\n" VERSION COPYRIGHT " by " AUTHOR "\n\n"};
  330.  
  331. struct Chunk        SPECIAL_CHUNK     = {NULL,ID_ILBM,ID_MAND,sizeof (struct MandelChunk),NULL};
  332.  
  333. UWORD PENS [] = {BLACK,DARK_GREY,WHITE,WHITE,DARK_GREY,LIGHT_GREY,DARK_GREY,LIGHT_GREY,DARK_GREY,WHITE,LIGHT_GREY,DARK_GREY,(UWORD) ~0};
  334.  
  335. /*
  336.  
  337. 01      0 DETAILPEN             SFONDO
  338. 02      1 BLOCKPEN              TESTO
  339. 03      1 TEXTPEN               TESTO EVIDENZIATO
  340. 04      2 SHINEPEN              BORDI CHIARI
  341. 05      1 SHADOWPEN             BORDI SCURI
  342. 06      3 FILLPEN               BARRA TITOLO FINESTRE ATTIVE
  343. 07      1 FILLTEXTPEN           TITOLO FINESTRE ATTIVE
  344. 08      0 BACKGROUNDPEN
  345. 09      2 HIGHLIGHTTEXTPEN
  346.  
  347. 10      1 BARDETAILPEN          TESTO NEI MENU
  348. 11      2 BARBLOCKPEN           SFONDO NEI MENU
  349. 12      1 BARTRIMPEN
  350.  
  351. */
  352.  
  353. ULONG COLORS_ECS [] = {32L << 16,
  354.                        0x00000000,0x00000000,0x00000000,
  355.                        0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  356.                        0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,
  357.                        0x66666666,0x66666666,0x66666666,
  358.                        0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  359.                        0xBBBBBBBB,0xBBBBBBBB,0xBBBBBBBB,
  360.                        0x77777777,0x77777777,0x77777777,
  361.                        0x33333333,0x33333333,0x33333333,
  362.                        0x33333333,0x33333333,0x00000000,
  363.                        0x77777777,0x77777777,0x00000000,
  364.                        0xBBBBBBBB,0xBBBBBBBB,0x00000000,
  365.                        0xFFFFFFFF,0xFFFFFFFF,0x00000000,
  366.                        0x00000000,0xFFFFFFFF,0x00000000,
  367.                        0x00000000,0xBBBBBBBB,0x00000000,
  368.                        0x00000000,0x77777777,0x00000000,
  369.                        0x00000000,0x33333333,0x00000000,
  370.                        0x33333333,0x00000000,0x33333333,
  371.                        0x77777777,0x00000000,0x77777777,
  372.                        0xBBBBBBBB,0x00000000,0xBBBBBBBB,
  373.                        0xFFFFFFFF,0x00000000,0xFFFFFFFF,
  374.                        0xFFFFFFFF,0x00000000,0x00000000,
  375.                        0xBBBBBBBB,0x00000000,0x00000000,
  376.                        0x77777777,0x00000000,0x00000000,
  377.                        0x33333333,0x00000000,0x00000000,
  378.                        0x00000000,0x33333333,0x33333333,
  379.                        0x00000000,0x77777777,0x77777777,
  380.                        0x00000000,0xBBBBBBBB,0xBBBBBBBB,
  381.                        0x00000000,0xFFFFFFFF,0xFFFFFFFF,
  382.                        0x00000000,0x00000000,0xFFFFFFFF,
  383.                        0x00000000,0x00000000,0xBBBBBBBB,
  384.                        0x00000000,0x00000000,0x77777777,
  385.                        0x00000000,0x00000000,0x33333333,
  386.                        NULL};
  387.  
  388.  
  389. ULONG COLORS_AGA []  =  {256L << 16,
  390.                          0x00000000,0x00000000,0x00000000, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA, 0x66666666,0x66666666,0x66666666,
  391.                          0x9f9f9f9f,0x9f9f9f9f,0x9f9f9f9f, 0xafafafaf,0xafafafaf,0xafafafaf, 0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf, 0xcfcfcfcf,0xcfcfcfcf,0xcfcfcfcf,
  392.                          0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf, 0xefefefef,0xefefefef,0xefefefef, 0xdfdfdfdf,0xefefefef,0xffffffff, 0xcfcfcfcf,0xdfdfdfdf,0xefefefef,
  393.                          0xbfbfbfbf,0xcfcfcfcf,0xdfdfdfdf, 0xafafafaf,0xbfbfbfbf,0xcfcfcfcf, 0x9f9f9f9f,0xafafafaf,0xbfbfbfbf, 0x8f8f8f8f,0x9f9f9f9f,0xafafafaf,
  394.                          0x7f7f7f7f,0x8f8f8f8f,0x9f9f9f9f, 0x6f6f6f6f,0x7f7f7f7f,0x8f8f8f8f, 0x5f5f5f5f,0x6f6f6f6f,0x7f7f7f7f, 0x4f4f4f4f,0x5f5f5f5f,0x6f6f6f6f,
  395.                          0x3f3f3f3f,0x4f4f4f4f,0x5f5f5f5f, 0x2f2f2f2f,0x3f3f3f3f,0x4f4f4f4f, 0x1f1f1f1f,0x2f2f2f2f,0x3f3f3f3f, 0x0f0f0f0f,0x1f1f1f1f,0x2f2f2f2f,
  396.                          0x00000000,0x0f0f0f0f,0x1f1f1f1f, 0x1f1f1f1f,0x0f0f0f0f,0x1f1f1f1f, 0x2f2f2f2f,0x1f1f1f1f,0x2f2f2f2f, 0x3f3f3f3f,0x2f2f2f2f,0x3f3f3f3f,
  397.                          0x4f4f4f4f,0x3f3f3f3f,0x4f4f4f4f, 0x5f5f5f5f,0x4f4f4f4f,0x5f5f5f5f, 0x6f6f6f6f,0x5f5f5f5f,0x6f6f6f6f, 0x7f7f7f7f,0x6f6f6f6f,0x7f7f7f7f,
  398.                          0x8f8f8f8f,0x7f7f7f7f,0x8f8f8f8f, 0x9f9f9f9f,0x8f8f8f8f,0x9f9f9f9f, 0xafafafaf,0x9f9f9f9f,0xafafafaf, 0xbfbfbfbf,0xafafafaf,0xbfbfbfbf,
  399.                          0xcfcfcfcf,0xbfbfbfbf,0xcfcfcfcf, 0xdfdfdfdf,0xcfcfcfcf,0xdfdfdfdf, 0xefefefef,0xdfdfdfdf,0xefefefef, 0xffffffff,0xefefefef,0xffffffff,
  400.                          0xefefefef,0xffffffff,0xefefefef, 0xdfdfdfdf,0xefefefef,0xdfdfdfdf, 0xcfcfcfcf,0xdfdfdfdf,0xcfcfcfcf, 0xbfbfbfbf,0xcfcfcfcf,0xbfbfbfbf,
  401.                          0xafafafaf,0xbfbfbfbf,0xafafafaf, 0x9f9f9f9f,0xafafafaf,0x9f9f9f9f, 0x8f8f8f8f,0x9f9f9f9f,0x8f8f8f8f, 0x7f7f7f7f,0x8f8f8f8f,0x7f7f7f7f,
  402.                          0x6f6f6f6f,0x7f7f7f7f,0x6f6f6f6f, 0x5f5f5f5f,0x6f6f6f6f,0x5f5f5f5f, 0x4f4f4f4f,0x5f5f5f5f,0x4f4f4f4f, 0x3f3f3f3f,0x4f4f4f4f,0x3f3f3f3f,
  403.                          0x2f2f2f2f,0x3f3f3f3f,0x2f2f2f2f, 0x1f1f1f1f,0x2f2f2f2f,0x1f1f1f1f, 0x0f0f0f0f,0x1f1f1f1f,0x0f0f0f0f, 0x0f0f0f0f,0x1f1f1f1f,0x1f1f1f1f,
  404.                          0x1f1f1f1f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x5f5f5f5f,0x5f5f5f5f,
  405.                          0x5f5f5f5f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x9f9f9f9f,0x9f9f9f9f,
  406.                          0x9f9f9f9f,0xafafafaf,0xafafafaf, 0xafafafaf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xdfdfdfdf,0xdfdfdfdf,
  407.                          0xdfdfdfdf,0xefefefef,0xefefefef, 0xefefefef,0xffffffff,0xffffffff, 0xffffffff,0xefefefef,0xefefefef, 0xefefefef,0xdfdfdfdf,0xdfdfdfdf,
  408.                          0xdfdfdfdf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xafafafaf,0xafafafaf, 0xafafafaf,0x9f9f9f9f,0x9f9f9f9f,
  409.                          0x9f9f9f9f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x5f5f5f5f,0x5f5f5f5f,
  410.                          0x5f5f5f5f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x1f1f1f1f,0x1f1f1f1f,
  411.                          0x1f1f1f1f,0x0f0f0f0f,0x0f0f0f0f, 0x1f1f1f1f,0x1f1f1f1f,0x0f0f0f0f, 0x2f2f2f2f,0x2f2f2f2f,0x1f1f1f1f, 0x3f3f3f3f,0x3f3f3f3f,0x2f2f2f2f,
  412.                          0x4f4f4f4f,0x4f4f4f4f,0x3f3f3f3f, 0x5f5f5f5f,0x5f5f5f5f,0x4f4f4f4f, 0x6f6f6f6f,0x6f6f6f6f,0x5f5f5f5f, 0x7f7f7f7f,0x7f7f7f7f,0x6f6f6f6f,
  413.                          0x8f8f8f8f,0x8f8f8f8f,0x7f7f7f7f, 0x9f9f9f9f,0x9f9f9f9f,0x8f8f8f8f, 0xafafafaf,0xafafafaf,0x9f9f9f9f, 0xbfbfbfbf,0xbfbfbfbf,0xafafafaf,
  414.                          0xcfcfcfcf,0xcfcfcfcf,0xbfbfbfbf, 0xdfdfdfdf,0xdfdfdfdf,0xcfcfcfcf, 0xefefefef,0xefefefef,0xdfdfdfdf, 0xffffffff,0xffffffff,0xefefefef,
  415.                          0xefefefef,0xefefefef,0xffffffff, 0xdfdfdfdf,0xdfdfdfdf,0xefefefef, 0xcfcfcfcf,0xcfcfcfcf,0xdfdfdfdf, 0xbfbfbfbf,0xbfbfbfbf,0xcfcfcfcf,
  416.                          0xafafafaf,0xafafafaf,0xbfbfbfbf, 0x9f9f9f9f,0x9f9f9f9f,0xafafafaf, 0x8f8f8f8f,0x8f8f8f8f,0x9f9f9f9f, 0x7f7f7f7f,0x7f7f7f7f,0x8f8f8f8f,
  417.                          0x6f6f6f6f,0x6f6f6f6f,0x7f7f7f7f, 0x5f5f5f5f,0x5f5f5f5f,0x6f6f6f6f, 0x4f4f4f4f,0x4f4f4f4f,0x5f5f5f5f, 0x3f3f3f3f,0x3f3f3f3f,0x4f4f4f4f,
  418.                          0x2f2f2f2f,0x2f2f2f2f,0x3f3f3f3f, 0x1f1f1f1f,0x1f1f1f1f,0x2f2f2f2f, 0x0f0f0f0f,0x0f0f0f0f,0x1f1f1f1f, 0x0f0f0f0f,0x0f0f0f0f,0x00000000,
  419.                          0x1f1f1f1f,0x1f1f1f1f,0x00000000, 0x2f2f2f2f,0x2f2f2f2f,0x00000000, 0x3f3f3f3f,0x3f3f3f3f,0x00000000, 0x4f4f4f4f,0x4f4f4f4f,0x00000000,
  420.                          0x5f5f5f5f,0x5f5f5f5f,0x00000000, 0x6f6f6f6f,0x6f6f6f6f,0x00000000, 0x7f7f7f7f,0x7f7f7f7f,0x00000000, 0x8f8f8f8f,0x8f8f8f8f,0x00000000,
  421.                          0x9f9f9f9f,0x9f9f9f9f,0x00000000, 0xafafafaf,0xafafafaf,0x00000000, 0xbfbfbfbf,0xbfbfbfbf,0x00000000, 0xcfcfcfcf,0xcfcfcfcf,0x00000000,
  422.                          0xdfdfdfdf,0xdfdfdfdf,0x00000000, 0xefefefef,0xefefefef,0x00000000, 0xffffffff,0xffffffff,0x00000000, 0xefefefef,0xffffffff,0x00000000,
  423.                          0xdfdfdfdf,0xffffffff,0x00000000, 0xcfcfcfcf,0xffffffff,0x00000000, 0xbfbfbfbf,0xffffffff,0x00000000, 0xafafafaf,0xffffffff,0x00000000,
  424.                          0x9f9f9f9f,0xffffffff,0x00000000, 0x8f8f8f8f,0xffffffff,0x00000000, 0x7f7f7f7f,0xffffffff,0x00000000, 0x6f6f6f6f,0xffffffff,0x00000000,
  425.                          0x5f5f5f5f,0xffffffff,0x00000000, 0x4f4f4f4f,0xffffffff,0x00000000, 0x3f3f3f3f,0xffffffff,0x00000000, 0x2f2f2f2f,0xffffffff,0x00000000,
  426.                          0x1f1f1f1f,0xffffffff,0x00000000, 0x0f0f0f0f,0xffffffff,0x00000000, 0x00000000,0xffffffff,0x00000000, 0x00000000,0xefefefef,0x00000000,
  427.                          0x00000000,0xdfdfdfdf,0x00000000, 0x00000000,0xcfcfcfcf,0x00000000, 0x00000000,0xbfbfbfbf,0x00000000, 0x00000000,0xafafafaf,0x00000000,
  428.                          0x00000000,0x9f9f9f9f,0x00000000, 0x00000000,0x8f8f8f8f,0x00000000, 0x00000000,0x7f7f7f7f,0x00000000, 0x00000000,0x6f6f6f6f,0x00000000,
  429.                          0x00000000,0x5f5f5f5f,0x00000000, 0x00000000,0x4f4f4f4f,0x00000000, 0x00000000,0x3f3f3f3f,0x00000000, 0x00000000,0x2f2f2f2f,0x00000000,
  430.                          0x00000000,0x1f1f1f1f,0x00000000, 0x00000000,0x0f0f0f0f,0x00000000, 0x0f0f0f0f,0x00000000,0x0f0f0f0f, 0x1f1f1f1f,0x00000000,0x1f1f1f1f,
  431.                          0x2f2f2f2f,0x00000000,0x2f2f2f2f, 0x3f3f3f3f,0x00000000,0x3f3f3f3f, 0x4f4f4f4f,0x00000000,0x4f4f4f4f, 0x5f5f5f5f,0x00000000,0x5f5f5f5f,
  432.                          0x6f6f6f6f,0x00000000,0x6f6f6f6f, 0x7f7f7f7f,0x00000000,0x7f7f7f7f, 0x8f8f8f8f,0x00000000,0x8f8f8f8f, 0x9f9f9f9f,0x00000000,0x9f9f9f9f,
  433.                          0xafafafaf,0x00000000,0xafafafaf, 0xbfbfbfbf,0x00000000,0xbfbfbfbf, 0xcfcfcfcf,0x00000000,0xcfcfcfcf, 0xdfdfdfdf,0x00000000,0xdfdfdfdf,
  434.                          0xefefefef,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xffffffff, 0xffffffff,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xdfdfdfdf,
  435.                          0xffffffff,0x00000000,0xcfcfcfcf, 0xffffffff,0x00000000,0xbfbfbfbf, 0xffffffff,0x00000000,0xafafafaf, 0xffffffff,0x00000000,0x9f9f9f9f,
  436.                          0xffffffff,0x00000000,0x8f8f8f8f, 0xffffffff,0x00000000,0x7f7f7f7f, 0xffffffff,0x00000000,0x6f6f6f6f, 0xffffffff,0x00000000,0x5f5f5f5f,
  437.                          0xffffffff,0x00000000,0x4f4f4f4f, 0xffffffff,0x00000000,0x3f3f3f3f, 0xffffffff,0x00000000,0x2f2f2f2f, 0xffffffff,0x00000000,0x1f1f1f1f,
  438.                          0xffffffff,0x00000000,0x0f0f0f0f, 0xffffffff,0x00000000,0x00000000, 0xefefefef,0x00000000,0x00000000, 0xdfdfdfdf,0x00000000,0x00000000,
  439.                          0xcfcfcfcf,0x00000000,0x00000000, 0xbfbfbfbf,0x00000000,0x00000000, 0xafafafaf,0x00000000,0x00000000, 0x9f9f9f9f,0x00000000,0x00000000,
  440.                          0x8f8f8f8f,0x00000000,0x00000000, 0x7f7f7f7f,0x00000000,0x00000000, 0x6f6f6f6f,0x00000000,0x00000000, 0x5f5f5f5f,0x00000000,0x00000000,
  441.                          0x4f4f4f4f,0x00000000,0x00000000, 0x3f3f3f3f,0x00000000,0x00000000, 0x2f2f2f2f,0x00000000,0x00000000, 0x1f1f1f1f,0x00000000,0x00000000,
  442.                          0x0f0f0f0f,0x00000000,0x00000000, 0x00000000,0x0f0f0f0f,0x0f0f0f0f, 0x00000000,0x1f1f1f1f,0x1f1f1f1f, 0x00000000,0x2f2f2f2f,0x2f2f2f2f,
  443.                          0x00000000,0x3f3f3f3f,0x3f3f3f3f, 0x00000000,0x4f4f4f4f,0x4f4f4f4f, 0x00000000,0x5f5f5f5f,0x5f5f5f5f, 0x00000000,0x6f6f6f6f,0x6f6f6f6f,
  444.                          0x00000000,0x7f7f7f7f,0x7f7f7f7f, 0x00000000,0x8f8f8f8f,0x8f8f8f8f, 0x00000000,0x9f9f9f9f,0x9f9f9f9f, 0x00000000,0xafafafaf,0xafafafaf,
  445.                          0x00000000,0xbfbfbfbf,0xbfbfbfbf, 0x00000000,0xcfcfcfcf,0xcfcfcfcf, 0x00000000,0xdfdfdfdf,0xdfdfdfdf, 0x00000000,0xefefefef,0xefefefef,
  446.                          0x00000000,0xffffffff,0xffffffff, 0x00000000,0xefefefef,0xffffffff, 0x00000000,0xdfdfdfdf,0xffffffff, 0x00000000,0xcfcfcfcf,0xffffffff,
  447.                          0x00000000,0xbfbfbfbf,0xffffffff, 0x00000000,0xafafafaf,0xffffffff, 0x00000000,0x9f9f9f9f,0xffffffff, 0x00000000,0x8f8f8f8f,0xffffffff,
  448.                          0x00000000,0x7f7f7f7f,0xffffffff, 0x00000000,0x6f6f6f6f,0xffffffff, 0x00000000,0x5f5f5f5f,0xffffffff, 0x00000000,0x4f4f4f4f,0xffffffff,
  449.                          0x00000000,0x3f3f3f3f,0xffffffff, 0x00000000,0x2f2f2f2f,0xffffffff, 0x00000000,0x1f1f1f1f,0xffffffff, 0x00000000,0x0f0f0f0f,0xffffffff,
  450.                          0x00000000,0x00000000,0xffffffff, 0x00000000,0x00000000,0xefefefef, 0x00000000,0x00000000,0xdfdfdfdf, 0x00000000,0x00000000,0xcfcfcfcf,
  451.                          0x00000000,0x00000000,0xbfbfbfbf, 0x00000000,0x00000000,0xafafafaf, 0x00000000,0x00000000,0x9f9f9f9f, 0x00000000,0x00000000,0x8f8f8f8f,
  452.                          0x00000000,0x00000000,0x7f7f7f7f, 0x00000000,0x00000000,0x6f6f6f6f, 0x00000000,0x00000000,0x5f5f5f5f, 0x00000000,0x00000000,0x4f4f4f4f,
  453.                          0x00000000,0x00000000,0x3f3f3f3f, 0x00000000,0x00000000,0x2f2f2f2f, 0x00000000,0x00000000,0x1f1f1f1f, 0x00000000,0x00000000,0x0f0f0f0f,
  454.                          NULL};
  455.  
  456. CHIP UWORD ZoomPointer[] = {0x0000,0x0000,0x0100,0x0000,0x0100,0x0000,0x0000,0x0100,
  457.                             0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000,
  458.                             0xCC66,0x3C78,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100,
  459.                             0x0000,0x0100,0x0000,0x0100,0x0100,0x0000,0x0100,0x0000,
  460.                             0x0000,0x0000};
  461.  
  462. struct NewMenu ProgMenu[] = { NM_TITLE,"Project",0,0,0,0,
  463.  
  464.                               NM_ITEM,"About...","A",NM_ITEMDISABLED,0,0,
  465.  
  466.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  467.  
  468.                               NM_ITEM,"Load picture...","L",NM_ITEMDISABLED,0,0,
  469.  
  470.                               NM_ITEM,"Save picture...","S",NM_ITEMDISABLED,0,0,
  471.  
  472.                               NM_ITEM,"Load palette...","Y",NM_ITEMDISABLED,0,0,
  473.  
  474.                               NM_ITEM,"Save palette...","E",NM_ITEMDISABLED,0,0,
  475.  
  476.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  477.  
  478.                               NM_ITEM,"Print...","D",NM_ITEMDISABLED,0,0,
  479.  
  480.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  481.  
  482.                               NM_ITEM,"Quit...","Q",NM_ITEMDISABLED,0,0,
  483.  
  484. /***************************************************************************************/
  485.  
  486.                               NM_TITLE,"Options",0,0,0,0,
  487.  
  488.                               NM_ITEM,"Title",0,NM_ITEMDISABLED,0,0,
  489.                               NM_SUB,"Title bar","O",CHECKIT|MENUTOGGLE|CHECKED,0,0,
  490.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  491.                               NM_SUB,"Last time","T",0,0,0,
  492.  
  493.                               NM_ITEM,"Limits...","C",NM_ITEMDISABLED,0,0,
  494.  
  495.                               NM_ITEM,"Iterations",0,NM_ITEMDISABLED,0,0,
  496.                               NM_SUB,"64",0,CHECKIT,~(1<<0),0,
  497.                               NM_SUB,"128",0,CHECKIT,~(1<<1),0,
  498.                               NM_SUB,"192",0,CHECKIT,~(1<<2),0,
  499.                               NM_SUB,"256",0,CHECKIT,~(1<<3),0,
  500.                               NM_SUB,"320",0,CHECKIT|CHECKED,~(1<<4),0,
  501.                               NM_SUB,"384",0,CHECKIT,~(1<<5),0,
  502.                               NM_SUB,"448",0,CHECKIT,~(1<<6),0,
  503.                               NM_SUB,"512",0,CHECKIT,~(1<<7),0,
  504.                               NM_SUB,"1024",0,CHECKIT,~(1<<8),0,
  505.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  506.                               NM_SUB,"Custom...","I",CHECKIT,~(1<<10),0,
  507.  
  508.                               NM_ITEM,"Priority",0,0,0,0,
  509.                               NM_SUB,"-5","%",CHECKIT,~(1<<0),0,
  510.                               NM_SUB,"-4","$",CHECKIT,~(1<<1),0,
  511.                               NM_SUB,"-3","£",CHECKIT,~(1<<2),0,
  512.                               NM_SUB,"-2","\"",CHECKIT,~(1<<3),0,
  513.                               NM_SUB,"-1","!",CHECKIT,~(1<<4),0,
  514.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  515.                               NM_SUB," 0","0",CHECKIT,~(1<<6),0,
  516.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  517.                               NM_SUB,"+1","1",CHECKIT,~(1<<8),0,
  518.                               NM_SUB,"+2","2",CHECKIT,~(1<<9),0,
  519.                               NM_SUB,"+3","3",CHECKIT,~(1<<10),0,
  520.                               NM_SUB,"+4","4",CHECKIT,~(1<<11),0,
  521.                               NM_SUB,"+5","5",CHECKIT,~(1<<12),0,
  522.  
  523.                               NM_ITEM,"Fractal type",0,0,0,0,
  524.                               NM_SUB,"Julia","J",CHECKIT,~(1<<0),0,
  525.                               NM_SUB,"Mandelbrot","M",CHECKIT,~(1<<1),0,
  526.  
  527. /***************************************************************************************/
  528.  
  529.                               NM_TITLE,"Calculate",0,0,0,0,
  530.  
  531.                               NM_ITEM,"PreView","W",NM_ITEMDISABLED,0,0,
  532.  
  533.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  534.  
  535.                               NM_ITEM,"ReCalculate","R",NM_ITEMDISABLED,0,0,
  536.  
  537.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  538.  
  539.                               NM_ITEM,"Undo","U",NM_ITEMDISABLED,0,0,
  540.  
  541.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  542.  
  543.                               NM_ITEM,"Zoom","Z",NM_ITEMDISABLED,0,0,
  544.  
  545.                               NM_ITEM,"Stop","X",0,0,0,
  546.  
  547. /***************************************************************************************/
  548.  
  549.                               NM_TITLE,"Video",0,0,0,0,
  550.  
  551.                               NM_ITEM,"Cycle",0,NM_ITEMDISABLED,0,0,
  552.                               NM_SUB,"Forward",">",0,0,0,
  553.                               NM_SUB,"Backward","<",0,0,0,
  554.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  555.                               NM_SUB,"Delay...","-",0,0,0,
  556.  
  557.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  558.  
  559.                               NM_ITEM,"Palette...","P",NM_ITEMDISABLED,0,0,
  560.  
  561.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  562.  
  563.                               NM_ITEM,"Screen mode...","V",NM_ITEMDISABLED,0,0,
  564.  
  565.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  566.  
  567.                               NM_ITEM,"Font settings...","F",NM_ITEMDISABLED,0,0,
  568.  
  569.                               NM_END,0,0,0,0,0 };
  570.  
  571.  
  572. struct Menu *MAINMENU = NULL;
  573.  
  574. struct BitMap *MYBITMAP = NULL;
  575.  
  576. struct Task *THISTASK = NULL;
  577.  
  578. struct TextFont *NEWFONT = NULL;
  579.  
  580. struct ILBMInfo MYILBM = {0};
  581.  
  582. LONG IlbmProps [] = { ID_ILBM, ID_BMHD, ID_ILBM, ID_CMAP, ID_ILBM, ID_CAMG, ID_ILBM, ID_MAND, TAG_END };
  583.  
  584. LONG IlbmCollects [] = { TAG_END };
  585.  
  586. LONG IlbmStops [] = { ID_ILBM, ID_BODY, TAG_END };
  587.  
  588. IMPORT WORD ASMCALL Mandel68k_FPU (REG (d0,WORD),REG (fp0,double),REG (fp1,double));
  589.  
  590. IMPORT WORD ASMCALL Julia68k_FPU (REG (d0,WORD),REG (fp0,double),REG (fp1,double),REG (fp6,double),REG (fp7,double));
  591.  
  592. IMPORT BOOL ModifyPalette (struct Window *,WORD,WORD,ULONG *);
  593.  
  594. IMPORT BOOL ScalePalette (struct Window *,ULONG *,ULONG,ULONG);
  595.  
  596. IMPORT BOOL Fade (struct Window *,ULONG *,ULONG,ULONG,BOOL);
  597.  
  598. IMPORT BOOL Cycle (struct Window *,ULONG,BOOL);
  599.  
  600. IMPORT LONG QueryMandPic (struct ILBMInfo *,struct MandelChunk **,UBYTE *);
  601.  
  602. IMPORT LONG LoadMandPic (struct ILBMInfo *,UBYTE *);
  603.  
  604. IMPORT LONG SaveMandPic (struct ILBMInfo *,struct Chunk *,struct Chunk *,UBYTE *);
  605.  
  606. IMPORT LONG LoadPalette (struct ILBMInfo *,UBYTE *);
  607.  
  608. IMPORT LONG SavePalette (struct ILBMInfo *,struct Chunk *,UBYTE *);
  609.  
  610.  
  611. /**************************************************************************************************************/
  612.  
  613.  
  614. LONG main (LONG Argc,CONST_STRPTR *Argv)
  615. {
  616. CONST_STRPTR *IconToolTypes;
  617.  
  618.   if (IconToolTypes = (CONST_STRPTR *) ArgArrayInit (Argc,Argv))
  619.   {
  620.         MYILBM.Bmhd.w = ArgInt (IconToolTypes,"SCREENWIDTH",DEF_WIDTH);
  621.         MYILBM.Bmhd.h = ArgInt (IconToolTypes,"SCREENHEIGHT",DEF_HEIGHT);
  622.         MYILBM.Bmhd.nPlanes = ArgInt (IconToolTypes,"SCREENDEPTH",MAX_DEPTH);
  623.  
  624.         sscanf (ArgString (IconToolTypes,"SCREENMODE",DEF_MONITORSTR),"%lx",&MYILBM.camg);
  625.  
  626.         sscanf (ArgString (IconToolTypes,"REALMIN",INIT_DEF_RMINSTR),"%Lf",&RMIN);
  627.         sscanf (ArgString (IconToolTypes,"REALMAX",INIT_DEF_RMAXSTR),"%Lf",&RMAX);
  628.         sscanf (ArgString (IconToolTypes,"IMAGMIN",INIT_DEF_IMINSTR),"%Lf",&IMIN);
  629.         sscanf (ArgString (IconToolTypes,"IMAGMAX",INIT_DEF_IMAXSTR),"%Lf",&IMAX);
  630.  
  631.         JULIA = (BOOL) ArgInt (IconToolTypes,"STARTWITHJULIA",FALSE);
  632.      
  633.         sscanf (ArgString (IconToolTypes,"JULIACONSTREAL",INIT_DEF_JKRESTR),"%Lf",&JKRE);
  634.         sscanf (ArgString (IconToolTypes,"JULIACONSTIMAG",INIT_DEF_JKIMSTR),"%Lf",&JKIM);
  635.  
  636.         strcpy (MYFONTSTRUCT.ta_Name,ArgString (IconToolTypes,"FONTNAME",DEF_FONTNAME));
  637.  
  638.         MYFONTSTRUCT.ta_YSize = ArgInt (IconToolTypes,"FONTSIZE",DEF_FONTSIZE);
  639.  
  640.         PRIORITY = ArgInt (IconToolTypes,"STARTPRI",DEF_STARTPRI);
  641.  
  642.         ArgArrayDone ();
  643.  
  644.         MYILBM.Bmhd.w = MIN (MAX_WIDTH,MAX (MYILBM.Bmhd.w,DEF_WIDTH));
  645.  
  646.         MYILBM.Bmhd.h = MIN (MAX_HEIGHT,MAX (MYILBM.Bmhd.h,DEF_HEIGHT));
  647.  
  648.         MYILBM.Bmhd.nPlanes = MIN (MAX_DEPTH,MAX (MYILBM.Bmhd.nPlanes,MIN_DEPTH));
  649.  
  650.         MYFONTSTRUCT.ta_YSize = MIN (MAX_FONTSIZE,MAX (MYFONTSTRUCT.ta_YSize,MIN_FONTSIZE));
  651.  
  652.         PRIORITY = MIN (5,MAX (PRIORITY,-5));
  653.      }
  654.  
  655.      else
  656.      {
  657.         MYILBM.camg = DEF_MONITOR;
  658.  
  659.         MYILBM.Bmhd.w = DEF_WIDTH;
  660.  
  661.         MYILBM.Bmhd.h = DEF_HEIGHT;
  662.  
  663.         MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_DEPTH);
  664.      }
  665.  
  666.      if (ModeNotAvailable (MYILBM.camg)) MYILBM.camg = ModeFallBack (MYILBM.camg,MYILBM.Bmhd.w,MYILBM.Bmhd.h,MYILBM.Bmhd.nPlanes);
  667.  
  668.      if (MYILBM.Bmhd.nPlanes > GetMaxPlanes (MYILBM.camg)) MYILBM.Bmhd.nPlanes = GetMaxPlanes (MYILBM.camg);
  669.  
  670.      if (MYILBM.Bmhd.nPlanes < MIN_DEPTH)
  671.      {
  672.         Fail (OpenDisplayError,20L);
  673.  
  674.         goto End;
  675.      }
  676.  
  677.      PALETTE = (CheckGFX () ? COLORS_AGA : COLORS_ECS);
  678.  
  679.      if ((RMIN >= RMAX) || (IMIN >= IMAX))
  680.      {
  681.        DEF_RMIN = INIT_DEF_RMIN;
  682.  
  683.        DEF_RMAX = INIT_DEF_RMAX;
  684.  
  685.        DEF_IMIN = INIT_DEF_IMIN;
  686.  
  687.        DEF_IMAX = INIT_DEF_IMAX;
  688.      }
  689.  
  690.      else
  691.      {
  692.        DEF_RMIN = RMIN;
  693.  
  694.        DEF_RMAX = RMAX;
  695.  
  696.        DEF_IMIN = IMIN;
  697.  
  698.        DEF_IMAX = IMAX;
  699.      }
  700.  
  701.      MYILBM.ParseInfo.propchks = IlbmProps;
  702.  
  703.      MYILBM.ParseInfo.collectchks = IlbmCollects;
  704.  
  705.      MYILBM.ParseInfo.stopchks = IlbmStops;
  706.  
  707.      MYILBM.Bmhd.pageWidth  = 0;
  708.  
  709.      MYILBM.Bmhd.pageHeight = 0;
  710.  
  711.      MYILBM.stype = CUSTOMSCREEN | SCREENQUIET;
  712.  
  713.      MYILBM.TBState = TMASK & MASK;
  714.  
  715.      MYILBM.ucliptype = OSCAN_TEXT;
  716.  
  717.      MYILBM.EHB = FALSE;
  718.  
  719.      MYILBM.Autoscroll = TRUE;
  720.  
  721.      MYILBM.IFFPFlags = NULL;
  722.  
  723.      if (MAINMENU = CreateMenus (ProgMenu,TAG_END))
  724.      {
  725.         if (MYILBM.Bmhd.nPlanes < 6)
  726.         {
  727.            MAX_ITERATIONS = 63;
  728.  
  729.            ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags ^= CHECKED;
  730.  
  731.            ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  732.         }
  733.  
  734.        switch (PRIORITY)
  735.         {
  736.           case -5: ItemAddress (MAINMENU,FULLMENUNUM (1,3,0))->Flags |= CHECKED;
  737.  
  738.                    break;
  739.  
  740.           case -4: ItemAddress (MAINMENU,FULLMENUNUM (1,3,1))->Flags |= CHECKED;
  741.  
  742.                    break;
  743.  
  744.           case -3: ItemAddress (MAINMENU,FULLMENUNUM (1,3,2))->Flags |= CHECKED;
  745.  
  746.                    break;
  747.  
  748.           case -2: ItemAddress (MAINMENU,FULLMENUNUM (1,3,3))->Flags |= CHECKED;
  749.  
  750.                    break;
  751.  
  752.           case -1: ItemAddress (MAINMENU,FULLMENUNUM (1,3,4))->Flags |= CHECKED;
  753.  
  754.                    break;
  755.  
  756.           case  0: ItemAddress (MAINMENU,FULLMENUNUM (1,3,6))->Flags |= CHECKED;
  757.  
  758.                    break;
  759.  
  760.           case  1: ItemAddress (MAINMENU,FULLMENUNUM (1,3,8))->Flags |= CHECKED;
  761.  
  762.                    break;
  763.  
  764.           case  2: ItemAddress (MAINMENU,FULLMENUNUM (1,3,9))->Flags |= CHECKED;
  765.  
  766.                    break;
  767.  
  768.           case  3: ItemAddress (MAINMENU,FULLMENUNUM (1,3,10))->Flags |= CHECKED;
  769.  
  770.                    break;
  771.  
  772.           case  4: ItemAddress (MAINMENU,FULLMENUNUM (1,3,11))->Flags |= CHECKED;
  773.  
  774.                    break;
  775.  
  776.           case  5: ItemAddress (MAINMENU,FULLMENUNUM (1,3,12))->Flags |= CHECKED;
  777.  
  778.                    break;
  779.         }
  780.  
  781.         SetTaskPri (FindTask (NULL),PRIORITY);
  782.  
  783.         if (JULIA)
  784.         {
  785.            H_LINE = JHLine;
  786.  
  787.            V_LINE = JVLine;
  788.  
  789.            ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED;
  790.         }
  791.  
  792.         else
  793.         {
  794.            H_LINE = MHLine;
  795.  
  796.            V_LINE = MVLine;
  797.  
  798.            ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED;
  799.         }
  800.  
  801.         if (CURRENT_MAX_COLORS = MakeDisplay (&MYILBM))
  802.         {
  803.            CURRENT_MAX_COLORS -= RESERVED_PENS;
  804.  
  805.            SaveCoords (MYILBM.win,FALSE);
  806.  
  807.            MANDChunk.LeftEdge = MYILBM.win->LeftEdge;
  808.  
  809.            MANDChunk.TopEdge = MYILBM.win->TopEdge;
  810.  
  811.            MANDChunk.Width = MYILBM.win->Width;
  812.  
  813.            MANDChunk.Height = MYILBM.win->Height;
  814.  
  815.            MANDChunk.RMin = RMIN;
  816.  
  817.            MANDChunk.RMax = RMAX;
  818.  
  819.            MANDChunk.IMin = IMIN;
  820.  
  821.            MANDChunk.IMax = IMAX;
  822.  
  823.            MANDChunk.Iterations = MAX_ITERATIONS + 1L;
  824.  
  825.            MANDChunk.Special = NULL;
  826.  
  827.            SPECIAL_CHUNK.ch_Data = &MANDChunk;
  828.  
  829.            PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER);
  830.  
  831.            ELAPSEDTIME = DrawFractal (MYILBM.win,(LONG) (MYILBM.win->LeftEdge),(LONG) (MYILBM.win->TopEdge),(LONG) (MYILBM.win->Width) - 1L,(LONG) (MYILBM.win->Height) - 1L);
  832.  
  833.            PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  834.  
  835.            SetMenuStart (MYILBM.win);
  836.  
  837.            ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME);
  838.  
  839.            ModifyIDCMP (MYILBM.win,NULL);
  840.  
  841.            ClearMenuStrip (MYILBM.win);
  842.  
  843.            About (MYILBM.win);
  844.  
  845.            ResetMenuStrip (MYILBM.win,MAINMENU);
  846.  
  847.            ModifyIDCMP (MYILBM.win,IDCMP_STANDARD);
  848.  
  849.            do
  850.            {
  851.              while (HandleEvents (&MYILBM) & NEWDISPLAY_MSG)
  852.              {
  853.                    if (SMRequest (&MYILBM))
  854.                    {
  855.                       if (ZMASK & MASK)
  856.                       {
  857.                          DrawBorder (MYILBM.wrp,&MYBORDER,0,0);
  858.  
  859.                          MASK ^= ZMASK;
  860.                       }
  861.  
  862.                       MYBITMAP = CopyBitMap (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height);
  863.  
  864.                       Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  865.  
  866.                       CloseDisplay (&MYILBM,VINFO);
  867.  
  868.                       MYILBM.Bmhd.pageWidth  = 0;
  869.  
  870.                       MYILBM.Bmhd.pageHeight = 0;
  871.  
  872.                       CURRENT_MAX_COLORS = MakeDisplay (&MYILBM);
  873.  
  874.                       if (CURRENT_MAX_COLORS)
  875.                       {
  876.                          CURRENT_MAX_COLORS -= RESERVED_PENS;
  877.  
  878.                          PasteBitMap (MYBITMAP,MYILBM.win,(WORD) GetBitMapAttr (MYBITMAP,BMA_WIDTH),(WORD) GetBitMapAttr (MYBITMAP,BMA_HEIGHT));
  879.  
  880.                          if (Choice (MYILBM.win,"Rendering requester","Screen propreties are changed.\nImage and colors can be inaccurate.\n\nRecalculate ?"))
  881.                          {
  882.                             SetMenuStop (MYILBM.win);
  883.  
  884.                             PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER);
  885.  
  886.                             ELAPSEDTIME = DrawFractal (MYILBM.win,(LONG) (MYILBM.win->LeftEdge),(LONG) (MYILBM.win->TopEdge),(LONG) (MYILBM.win->Width) - 1L,(LONG) (MYILBM.win->Height) - 1L);
  887.  
  888.                             PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  889.  
  890.                             SetMenuStart (MYILBM.win);
  891.  
  892.                             ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME);
  893.                          }
  894.                       }
  895.  
  896.                       else
  897.                       {
  898.                             Fail (MakeDisplayError,20L);
  899.  
  900.                             break;
  901.                       }
  902.                    }
  903.              }
  904.  
  905.              if (RETURNVALUE >= 20L) break;
  906.  
  907.            } while (! Choice (MYILBM.win,"Exit requester","Are you sure ?"));
  908.  
  909.            if (BMASK & MASK) FreeBitMapSafety (MYBITMAP);
  910.         }
  911.  
  912.         else Fail (MakeDisplayError,20L);
  913.  
  914.         Fade (MYILBM.win,PALETTE,50L,1L,TOBLACK);
  915.  
  916.         CloseDisplay (&MYILBM,VINFO);
  917.  
  918.         FreeMenus (MAINMENU);
  919.    }
  920.  
  921.      else Fail (MenuError,20L);
  922.  
  923. End:
  924.  
  925.   exit (RETURNVALUE);
  926. }
  927.  
  928.   /***********************************************************************************************************/
  929.  
  930. void PutPointer (struct Window *Win,UWORD *PointerImage,LONG Width,LONG Height,LONG XOrigin,LONG YOrigin,UBYTE Type)
  931. {
  932.   switch (Type)
  933.   {
  934.      case CLEAR_POINTER:  SetWindowPointer (Win,TAG_END);
  935.  
  936.                           break;
  937.  
  938.      case BUSY_POINTER:   SetWindowPointer (Win,WA_BusyPointer,TRUE,TAG_END);
  939.  
  940.                           break;
  941.  
  942.      case ZOOM_POINTER:   SetPointer (Win,PointerImage,Height,Width,XOrigin,YOrigin);
  943.   }
  944. }
  945.  
  946. UBYTE GetMaxPlanes (ULONG ModeID)
  947. {
  948. DisplayInfoHandle DisplayHandle;
  949.  
  950. struct DimensionInfo DimensionInfo;
  951.  
  952. UBYTE Planes = 0;
  953.  
  954.   DisplayHandle = FindDisplayInfo (ModeID);
  955.  
  956.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,ModeID))
  957.   {
  958.      Planes = DimensionInfo.MaxDepth;
  959.   }
  960.  
  961.   else Fail (DimensionInfoError,20L);
  962.  
  963.   return Planes;
  964. }
  965.  
  966. LONG CheckGFX (VOID)
  967. {
  968. DisplayInfoHandle DisplayHandle;
  969.  
  970. struct DisplayInfo DisplayInfo;
  971.  
  972. BOOL AGA = FALSE,RTG = FALSE;
  973.  
  974. ULONG ModeID = (ULONG) INVALID_ID;
  975.  
  976.   if (GetMaxPlanes (LORES_KEY) == MAX_DEPTH) AGA = TRUE;
  977.  
  978.   while (((ModeID = NextDisplayInfo (ModeID)) != INVALID_ID) && RTG == FALSE)
  979.   {
  980.         DisplayHandle = FindDisplayInfo (ModeID);
  981.  
  982.         if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,ModeID))
  983.         {
  984.            if ((DisplayInfo.PropertyFlags & DIPF_IS_FOREIGN) && (GetMaxPlanes (ModeID) >= MAX_DEPTH)) RTG = TRUE;
  985.         }
  986.   }
  987.  
  988.   if (RTG && AGA) return 3L;
  989.  
  990.   if (RTG) return 2L;
  991.  
  992.   if (AGA) return 1L;
  993.  
  994.   return NULL;
  995. }
  996.  
  997. VOID CloseDisplay (struct ILBMInfo *Ilbm,CPTR *VInfo)
  998. {
  999.   if (WMASK & MASK)
  1000.   {
  1001.      ClearMenuStrip (Ilbm->win);
  1002.  
  1003.      PutPointer (Ilbm->win,0,0,0,0,0,CLEAR_POINTER);
  1004.  
  1005.      CloseWindow (Ilbm->win);
  1006.  
  1007.      Ilbm->win = NULL;
  1008.  
  1009.      Ilbm->wrp = NULL;
  1010.  
  1011.      MASK ^= WMASK;
  1012.   }
  1013.  
  1014.   if (VMASK & MASK)
  1015.   {
  1016.      FreeVisualInfo (VInfo);
  1017.  
  1018.      MASK ^= VMASK;
  1019.   }
  1020.  
  1021.   if (MMASK & MASK)
  1022.   {
  1023.      FreeBitMapSafety (TempBM);
  1024.  
  1025.      MASK ^= MMASK;
  1026.   }
  1027.  
  1028.   if (LMASK & MASK)
  1029.   {
  1030.      FreeVec (PixelLine);
  1031.  
  1032.      MASK ^= LMASK;
  1033.   }
  1034.  
  1035.   if (SMASK & MASK)
  1036.   {
  1037.      CloseScreen (Ilbm->scr);
  1038.  
  1039.      FreeBitMapSafety (Ilbm->brbitmap);
  1040.  
  1041.      Ilbm->scr = NULL;
  1042.  
  1043.      Ilbm->vp  = NULL;
  1044.  
  1045.      Ilbm->srp = NULL;
  1046.  
  1047.      MASK ^= SMASK;
  1048.   }
  1049.  
  1050.   if (FMASK & MASK)
  1051.   {
  1052.      CloseFont (NEWFONT);
  1053.  
  1054.      MASK ^= FMASK;
  1055.   }  
  1056. }
  1057.  
  1058. BOOL AllocTempRast (UWORD Width,UBYTE Planes)
  1059. {
  1060. BOOL Success = FALSE;
  1061.  
  1062.   if (TempBM = AllocBitMap ((((Width + 15) >> 4) << 1), 1, Planes, BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES, NULL))
  1063.   {
  1064.      InitRastPort (&TempRP);
  1065.  
  1066.      TempRP.Layer = NULL;
  1067.  
  1068.      TempRP.BitMap = TempBM;
  1069.  
  1070.      if (PixelLine = AllocVec (((((Width + 15) * sizeof (*PixelLine)) >> 4)  << 4),MEMF_CLEAR | MEMF_PUBLIC)) Success = TRUE;
  1071.  
  1072.      else FreeBitMapSafety (TempBM);
  1073.   }
  1074.  
  1075.   return Success;
  1076. }
  1077.  
  1078. struct Window *OpenDisplay (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  1079. {
  1080. struct Screen *Scr;
  1081.  
  1082. struct Window *Win = NULL;
  1083.  
  1084.   if (Scr = OpenIdScreen (Ilbm,Width,Height,Depth,ModeID))
  1085.   {
  1086.      Win = OpenWindowTags (NULL,
  1087.                            WA_Left,Scr->LeftEdge,
  1088.                            WA_Top,Scr->TopEdge,
  1089.                            WA_Width,Scr->Width,
  1090.                            WA_Height,Scr->Height,
  1091.                            WA_ScreenTitle,VERSION,
  1092.                            WA_CustomScreen,Scr,
  1093.                            WA_IDCMP,IDCMP_STANDARD,
  1094.                            WA_Flags,WFLG_STANDARD,
  1095.                            WA_MouseQueue,1L,
  1096.                            WA_BusyPointer,TRUE,
  1097.                            TAG_END);
  1098.  
  1099.      if (! Win)
  1100.      {
  1101.         if (Scr) CloseScreen (Scr);
  1102.  
  1103.         return NULL;
  1104.      }
  1105.  
  1106.      Ilbm->scr = Scr;
  1107.  
  1108.      Ilbm->win = Win;
  1109.  
  1110.      Ilbm->vp  = &(Scr->ViewPort);
  1111.  
  1112.      Ilbm->srp = &(Scr->RastPort);
  1113.  
  1114.      Ilbm->wrp = Win->RPort;
  1115.  
  1116.      Ilbm->Bmhd.w = (UWORD) Ilbm->win->Width;
  1117.  
  1118.      Ilbm->Bmhd.h = Ilbm->win->Height;
  1119.  
  1120.      Ilbm->Bmhd.nPlanes = Ilbm->wrp->BitMap->Depth;
  1121.   }
  1122.  
  1123.   return (Win);
  1124. }
  1125.  
  1126. struct Screen *OpenIdScreen (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  1127. {
  1128. struct Rectangle Spos,DClip,TxtO,StdO,MaxO,UClip;
  1129.  
  1130. struct Rectangle *UClipp;
  1131.  
  1132. struct Screen *Scr;
  1133.  
  1134. LONG ErrorCode = NULL,TryNew;
  1135.  
  1136. ULONG BitMapTag,PassedTags;
  1137.  
  1138.   if (! Ilbm) return (NULL);
  1139.  
  1140.   TryNew = ((QueryOverscan (ModeID,&TxtO,OSCAN_TEXT)) && (QueryOverscan (ModeID,&StdO,OSCAN_STANDARD)) && (QueryOverscan (ModeID,&MaxO,OSCAN_MAX)));
  1141.  
  1142.   if (TryNew)
  1143.   {
  1144.      if (Ilbm->Video) Ilbm->ucliptype = OSCAN_VIDEO;
  1145.  
  1146.      if ((Ilbm->ucliptype) && (QueryOverscan (ModeID,&UClip,(LONG) Ilbm->ucliptype))) UClipp = &UClip;
  1147.  
  1148.      else UClipp = NULL;
  1149.  
  1150.      ClipIt (Width,Height,&Spos,&DClip,&TxtO,&StdO,&MaxO,UClipp,Ilbm->IFFPFlags & IFFPF_NOCENTER ? TRUE : FALSE);
  1151.  
  1152.      BitMapTag = ((Ilbm->brbitmap) && (Ilbm->stype & CUSTOMBITMAP)) ? SA_BitMap : TAG_IGNORE;
  1153.  
  1154.      PassedTags = Ilbm->stags ? TAG_MORE : TAG_IGNORE;
  1155.  
  1156.      Scr = OpenScreenTags (NULL,
  1157.                            SA_DisplayID,   ModeID,
  1158.                            SA_Type,        Ilbm->stype,
  1159.                            SA_Top,         Spos.MinY,
  1160.                            SA_Left,        Spos.MinX,
  1161.                            SA_Width,       Width,
  1162.                            SA_Height,      Height,
  1163.                            SA_Depth,       Depth,
  1164.                            SA_DClip,       &DClip,
  1165.                            SA_AutoScroll,  Ilbm->Autoscroll,
  1166.                            SA_Colors32,    PALETTE,
  1167.                            SA_Pens,        PENS,
  1168.                            SA_Interleaved, TRUE,
  1169.                            SA_Font,        &MYFONTSTRUCT,
  1170.                            SA_Title,       VERSION,
  1171.                            SA_ErrorCode,   &ErrorCode,
  1172.                            SA_ShowTitle,   Ilbm->TBState,
  1173.                            BitMapTag,      Ilbm->brbitmap,
  1174.                            PassedTags,     Ilbm->stags,
  1175.                            TAG_END);
  1176.  
  1177.      if (! Scr)
  1178.      {
  1179.         switch (ErrorCode)
  1180.         {
  1181.                  case OSERR_NOMONITOR   : Fail (NoMonitor,20L);
  1182.  
  1183.                                           break;
  1184.  
  1185.                  case OSERR_NOCHIPS     : Fail (NoChips,20L);
  1186.  
  1187.                                           break;
  1188.  
  1189.                  case OSERR_NOMEM       : Fail (NoMem,20L);
  1190.  
  1191.                                           break;
  1192.  
  1193.                  case OSERR_NOCHIPMEM   : Fail (NoChipMem,20L);
  1194.  
  1195.                                           break;
  1196.  
  1197.                  case OSERR_PUBNOTUNIQUE: Fail (PubNotUnique,20L);
  1198.  
  1199.                                           break;
  1200.  
  1201.                  case OSERR_UNKNOWNMODE : Fail (UnknownMode,20L);
  1202.  
  1203.                                           break;
  1204.  
  1205.                  case OSERR_TOODEEP     : Fail (ScreenTooDeep,20L);
  1206.  
  1207.                                           break;
  1208.  
  1209.                  case OSERR_ATTACHFAIL  : Fail (AttachScreen,20L);
  1210.  
  1211.                                           break;
  1212.  
  1213.                  case OSERR_NOTAVAILABLE: Fail (ModeNotAvailableError,20L);
  1214.  
  1215.                                           break;
  1216.  
  1217.                  default                : Fail (UnknownScrError,20L);
  1218.  
  1219.                                           break;
  1220.         }
  1221.  
  1222.         return NULL;
  1223.      }
  1224.   }
  1225.  
  1226.   else return NULL;
  1227.  
  1228.   return (Scr);
  1229. }
  1230.  
  1231. ULONG ModeFallBack (ULONG OldModeID,WORD Width,WORD Height,WORD Depth)
  1232. {
  1233. struct Screen *PubScreen;
  1234.  
  1235. ULONG NewModeID = HIRESLACE_KEY,ModeID;
  1236.  
  1237.   if (PubScreen = LockPubScreen (NULL))
  1238.   {
  1239.      NewModeID = GetVPModeID (&(PubScreen->ViewPort));
  1240.  
  1241.      UnlockPubScreen (NULL,PubScreen);
  1242.   }
  1243.  
  1244.   ModeID = BestModeID (BIDTAG_DIPFMustHave,(OldModeID & EXTRAHALFBRITE_KEY ? DIPF_IS_EXTRAHALFBRITE : 0),
  1245.                        BIDTAG_NominalWidth,Width,
  1246.                        BIDTAG_NominalHeight,Height,
  1247.                        BIDTAG_Depth,Depth,
  1248. /*                       BIDTAG_SourceID,NewModeID, */
  1249.                        TAG_END);
  1250.  
  1251.   if (ModeID != INVALID_ID) NewModeID = ModeID;
  1252.  
  1253.   return (NewModeID);
  1254. }
  1255.  
  1256. VOID ClipIt (WORD wide,WORD high,struct Rectangle *spos,struct Rectangle *dclip,struct Rectangle *txto, struct Rectangle *stdo,struct Rectangle *maxo, struct Rectangle *uclip,BOOL NoCenter)
  1257. {
  1258. struct Rectangle *besto;
  1259.  
  1260. WORD minx, maxx, miny, maxy;
  1261.  
  1262. WORD txtw, txth, stdw, stdh, bestw, besth;
  1263.  
  1264.     /* get the txt, std and max widths and heights */
  1265.  
  1266.     txtw = txto->MaxX - txto->MinX + 1;
  1267.  
  1268.     txth = txto->MaxY - txto->MinY + 1;
  1269.  
  1270.     stdw = stdo->MaxX - stdo->MinX + 1;
  1271.  
  1272.     stdh = stdo->MaxY - stdo->MinY + 1;
  1273.  
  1274.     if ((wide <= txtw) && (high <= txth))
  1275.     {
  1276.         besto = txto;
  1277.  
  1278.         bestw = txtw;
  1279.  
  1280.         besth = txth;
  1281.     }
  1282.  
  1283.     else
  1284.     {
  1285.         besto = stdo;
  1286.  
  1287.         bestw = stdw;
  1288.  
  1289.         besth = stdh;
  1290.     }
  1291.  
  1292.     if (uclip)
  1293.     {
  1294.         *dclip = *uclip;
  1295.  
  1296.         spos->MinX = uclip->MinX;
  1297.  
  1298.         spos->MinY = uclip->MinY;
  1299.     }
  1300.  
  1301.     else
  1302.     {
  1303.         /* CENTER the screen based on best oscan prefs
  1304.         * but confine dclip within max oscan limits
  1305.         *
  1306.         * FIX MinX first */
  1307.  
  1308.         spos->MinX = minx = besto->MinX - ((wide - bestw) >> 1);
  1309.  
  1310.         maxx = wide + minx - 1;
  1311.  
  1312.         if (maxx > maxo->MaxX)  maxx = maxo->MaxX;      /* too right */
  1313.  
  1314.         if (minx < maxo->MinX)
  1315.         {
  1316.             minx = maxo->MinX;  /* too left  */
  1317.  
  1318.             /* if we want left edge of screen not clipped */
  1319.  
  1320.             if (NoCenter) spos->MinX = minx;
  1321.         }
  1322.  
  1323.         /* FIX MinY */
  1324.  
  1325.         spos->MinY = miny = besto->MinY - ((high - besth) >> 1);
  1326.  
  1327.         /* if lower than top of txto, move up */
  1328.  
  1329.         spos->MinY = miny = MIN (spos->MinY,txto->MinY);
  1330.  
  1331.         maxy = high + miny - 1;
  1332.  
  1333.         if (maxy > maxo->MaxY)  maxy = maxo->MaxY;      /* too down  */
  1334.  
  1335.         if (miny < maxo->MinY)
  1336.         {
  1337.            miny = maxo->MinY;   /* too up    */
  1338.  
  1339.            /* if we want top of screen not clipped */
  1340.  
  1341.            if (NoCenter) spos->MinY = miny;
  1342.         }
  1343.  
  1344.         /* SET up dclip */
  1345.  
  1346.         dclip->MinX = minx;
  1347.  
  1348.         dclip->MinY = miny;
  1349.  
  1350.         dclip->MaxX = maxx;
  1351.  
  1352.         dclip->MaxY = maxy;
  1353.     }
  1354. }
  1355.  
  1356. LONG MakeDisplay (struct ILBMInfo *Ilbm)
  1357. {
  1358. static ULONG SAVED_COMPONENT = NULL,SAVED_POSITION = NULL;
  1359.  
  1360.   if (Ilbm->IFFPFlags & IFFPF_USERMODE) Ilbm->camg = Ilbm->usermodeid;
  1361.  
  1362.   Ilbm->Bmhd.w = MAX (MIN_WIDTH,Ilbm->Bmhd.w);
  1363.  
  1364.   Ilbm->Bmhd.h = MAX (MIN_HEIGHT,Ilbm->Bmhd.h);
  1365.  
  1366.   if (ModeNotAvailable (Ilbm->camg) || (Ilbm->IFFPFlags & IFFPF_BESTFIT))
  1367.  
  1368.      Ilbm->camg = ModeFallBack (Ilbm->camg,Ilbm->Bmhd.w,Ilbm->Bmhd.h,Ilbm->Bmhd.nPlanes);
  1369.  
  1370.   Ilbm->Bmhd.nPlanes = MAX (MIN_DEPTH,Ilbm->Bmhd.nPlanes);
  1371.  
  1372.   if (Ilbm->Bmhd.nPlanes > GetMaxPlanes (Ilbm->camg)) Ilbm->Bmhd.nPlanes = GetMaxPlanes (Ilbm->camg);
  1373.  
  1374.   if (NEWFONT = OpenDiskFont (&MYFONTSTRUCT)) MASK |= FMASK;
  1375.  
  1376.   else
  1377.   {
  1378.      strcpy (MYFONTSTRUCT.ta_Name,DEF_FONTNAME);
  1379.  
  1380.      MYFONTSTRUCT.ta_YSize = DEF_FONTSIZE;
  1381.  
  1382.      MYFONTSTRUCT.ta_Style = FS_NORMAL;
  1383.  
  1384.      MYFONTSTRUCT.ta_Flags = FPF_ROMFONT;
  1385.  
  1386.      if (NEWFONT = OpenFont (&MYFONTSTRUCT)) MASK |= FMASK;
  1387.  
  1388.      else
  1389.      {
  1390.        Fail (FontError,20L);
  1391.  
  1392.        return NULL;
  1393.      }
  1394.   }
  1395.  
  1396.   *PALETTE = (1L << Ilbm->Bmhd.nPlanes) << 16;
  1397.  
  1398.   if (SAVED_POSITION) (*(PALETTE + SAVED_POSITION) = SAVED_COMPONENT);
  1399.  
  1400.   SAVED_POSITION = (3L * (ULONG) (1L << Ilbm->Bmhd.nPlanes)) + 1L;
  1401.  
  1402.   SAVED_COMPONENT = *(PALETTE + SAVED_POSITION);
  1403.  
  1404.   *(PALETTE + SAVED_POSITION) = NULL;
  1405.  
  1406.   if (! (OpenDisplay (Ilbm,MAX (Ilbm->Bmhd.pageWidth,Ilbm->Bmhd.w),MAX (Ilbm->Bmhd.pageHeight,Ilbm->Bmhd.h),Ilbm->Bmhd.nPlanes,Ilbm->camg))) return NULL;
  1407.  
  1408.   MASK |= SMASK;
  1409.  
  1410.   MASK |= WMASK;
  1411.  
  1412.   if (! (AllocTempRast (Ilbm->Bmhd.w,Ilbm->Bmhd.nPlanes)))
  1413.   {
  1414.      Fail (NoMemForTempRastPort,20L);
  1415.  
  1416.      return (NULL);
  1417.   }
  1418.  
  1419.   MASK |= MMASK;
  1420.  
  1421.   MASK |= LMASK;
  1422.  
  1423.   if (! (VINFO = GetVisualInfo (Ilbm->scr,TAG_END)))
  1424.   {
  1425.      Fail (VisualInfoError,20L);
  1426.  
  1427.      return NULL;
  1428.   }
  1429.  
  1430.   MASK |= VMASK;
  1431.  
  1432.   if (! (LayoutMenus (MAINMENU,VINFO,GTMN_TextAttr,&MYFONTSTRUCT,GTMN_NewLookMenus,TRUE,TAG_END)))
  1433.   {
  1434.      Fail (FontError,20L);
  1435.  
  1436.      return NULL;
  1437.   }
  1438.  
  1439.   SetMenuStrip (Ilbm->win,MAINMENU);
  1440.  
  1441.   Ilbm->EHB = FALSE;
  1442.  
  1443.   return (Ilbm->vp->ColorMap->Count);
  1444. }
  1445.  
  1446. VOID ShowTime (struct Window *Win,TEXT *String,ULONG Secs)
  1447. {
  1448.   sprintf (BAR_STRING,"%s %uh %um %us - Average speed: %.1Lf Pix/sec",String,Secs / 3600L,(Secs / 60L) % 60L,Secs % 60L,(double) ((Win->Width - Win->LeftEdge) * (Win->Height - Win->TopEdge)) / (double) Secs);
  1449.  
  1450.   SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING);
  1451. }
  1452.  
  1453. void SaveCoords (struct Window *Win,BOOL GhostMenu)
  1454. {
  1455.   if (GhostMenu) OnMenu (Win,FULLMENUNUM (2,4,NOSUB));
  1456.  
  1457.   URMIN = RMIN;
  1458.  
  1459.   URMAX = RMAX;
  1460.  
  1461.   UIMIN = IMIN;
  1462.  
  1463.   UIMAX = IMAX;
  1464.  
  1465.   UJKRE = JKRE;
  1466.  
  1467.   UJKIM = JKIM;
  1468. }
  1469.  
  1470. void RestoreCoords (struct Window *Win)
  1471. {
  1472.   RMIN = URMIN;
  1473.  
  1474.   RMAX = URMAX;
  1475.  
  1476.   IMIN = UIMIN;
  1477.  
  1478.   IMAX = UIMAX;
  1479.  
  1480.   JKRE = UJKRE;
  1481.  
  1482.   JKIM = UJKIM;
  1483.  
  1484.   OffMenu  (Win,FULLMENUNUM (2,4,NOSUB));
  1485. }
  1486.  
  1487. BOOL NewCoords (struct Window *Win,WORD a1,WORD b1,WORD a2,WORD b2)
  1488. {
  1489. double KReal,KImag;
  1490.  
  1491.   if (((a2 - a1) < 2L) || ((b2 - b1) < 2L)) return FALSE;
  1492.  
  1493.   KReal = fabs (RMAX-RMIN) / ((double) Win->Width);
  1494.  
  1495.   KImag = fabs (IMAX-IMIN) / ((double) Win->Height);
  1496.  
  1497.   SaveCoords (Win,TRUE);
  1498.  
  1499.   RMAX = RMIN + ((double) a2 * KReal);
  1500.  
  1501.   IMIN = IMAX - ((double) b2 * KImag);
  1502.  
  1503.   RMIN += ((double) a1 * KReal);
  1504.  
  1505.   IMAX -= ((double) b1 * KImag);
  1506.  
  1507.   return TRUE;
  1508. }
  1509.  
  1510. void AdjustRatio (double *RMin,double *IMax,double *RMax,double *IMin,WORD ScrWidth,WORD ScrHeight,BOOL KeepReal)
  1511. {
  1512. double RWidth,IHeight,RCenter,ICenter;
  1513.  
  1514.   IHeight = *IMax - *IMin;
  1515.  
  1516.   RWidth  = *RMax - *RMin;
  1517.  
  1518.   if (KeepReal)
  1519.   {
  1520.      ICenter = *IMin + (IHeight / 2.0);
  1521.  
  1522.      IHeight = (RWidth * ScrHeight) / ScrWidth;
  1523.  
  1524.      *IMax = ICenter + (IHeight / 2.0);
  1525.  
  1526.      *IMin = ICenter - (IHeight / 2.0);
  1527.   }
  1528.  
  1529.   else
  1530.   {
  1531.      RCenter = *RMin + (RWidth / 2.0);
  1532.  
  1533.      RWidth = (IHeight * ScrWidth) / ScrHeight;
  1534.  
  1535.      *RMax = RCenter + (RWidth / 2.0);
  1536.  
  1537.      *RMin = RCenter - (RWidth / 2.0);
  1538.   }
  1539. }
  1540.  
  1541. LONG About (struct Window *Win)
  1542. {
  1543. static struct EasyStruct MyReq_1 = { sizeof (struct EasyStruct),0,"Informations requester","  " VERSION COPYRIGHT "\n\n\n  Snail address:" "\n  " AUTHOR "\n  " ADDRESS "\n\n\n  " EMAIL "\n\n  This program is GiftWare!  \n\n","Ok|More..." };
  1544.  
  1545. static struct EasyStruct MyReq_2 = { sizeof (struct EasyStruct),0,"Workgroup","Greetings & thanks in alphabetical order:\n\n  Claudio Pucci\n  Giorgio Signori\n  Giuseppe Staffelli\n  Sergio Tassi\n\n\nIf someone hasn't the courage to risk\nfor his ideals, either his ideals are\nworth nothing, or worth nothing is he\n\nAmiga forever.\n\n","Ok" };
  1546.  
  1547. LONG More;
  1548.  
  1549.   More = EasyRequest (Win,&MyReq_1,0);
  1550.  
  1551.   if (! More) EasyRequest (Win,&MyReq_2,0);
  1552.  
  1553.   return More;
  1554. }
  1555.  
  1556. ULONG Fail (UBYTE *ErrorString,ULONG ErrorLevel)
  1557. {
  1558.   DisplayBeep (NULL);
  1559.  
  1560.   fputs (ErrorString,stderr);
  1561.  
  1562.   RETURNVALUE = ErrorLevel;
  1563.  
  1564.   return ErrorLevel;
  1565. }
  1566.  
  1567. LONG Choice (struct Window *Win,TEXT *Title,TEXT *String)
  1568. {
  1569. struct EasyStruct MyReq = { sizeof (struct EasyStruct),NULL,0,0,"Yes|No" };
  1570.  
  1571.   MyReq.es_Title = Title;
  1572.  
  1573.   MyReq.es_TextFormat = String;
  1574.  
  1575.   return EasyRequest (Win,&MyReq,0);
  1576. }
  1577.  
  1578. BOOL ShowCoords (struct Window *Win)
  1579. {
  1580. struct Gadget *GadList = NULL,*StringGad_1,*StringGad_2,*StringGad_3,*StringGad_4,*StringGad_5,*StringGad_6;
  1581.  
  1582. struct Gadget *MyButtonGad,*MyCheckBoxGad,*MyGad;
  1583.  
  1584. struct Window *GadWin;
  1585.  
  1586. struct IntuiMessage *Message;
  1587.  
  1588. BOOL NewLimits = FALSE,Exit = FALSE,Accept = FALSE,Reset = FALSE,Ratio = FALSE,KeepReal = TRUE;
  1589.  
  1590. TEXT String [MAXCHARS];
  1591.  
  1592. UWORD MyCode;
  1593.  
  1594. ULONG MyClass;
  1595.  
  1596. double Tmp_RMIN = RMIN,Tmp_IMAX = IMAX,Tmp_RMAX = RMAX,Tmp_IMIN = IMIN,Tmp_JKRE,Tmp_JKIM;
  1597.  
  1598.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = CHECKBOXGAD.ng_VisualInfo  = VINFO;
  1599.  
  1600.   StringGad_1 = CreateContext (&GadList);
  1601.  
  1602.   TEXTGAD.ng_LeftEdge     = 118;
  1603.  
  1604.   TEXTGAD.ng_TopEdge      = 20;
  1605.  
  1606.   TEXTGAD.ng_Width        = 194;
  1607.  
  1608.   TEXTGAD.ng_Height       = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  1609.  
  1610.   TEXTGAD.ng_GadgetText   = "_Left";
  1611.  
  1612.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1613.  
  1614.   sprintf (String,"%+2.15Lf",RMIN);
  1615.  
  1616.   StringGad_1 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1617.  
  1618.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1619.  
  1620.   TEXTGAD.ng_GadgetText   = "_Top ";
  1621.  
  1622.   sprintf (String,"%+2.15Lf",IMAX);
  1623.  
  1624.   StringGad_2 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1625.  
  1626.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1627.  
  1628.   TEXTGAD.ng_GadgetText   = "_Right";
  1629.  
  1630.   TEXTGAD.ng_Flags        = PLACETEXT_RIGHT;
  1631.  
  1632.   sprintf (String,"%+2.15Lf",RMAX);
  1633.  
  1634.   StringGad_3 = CreateGadget (STRING_KIND,StringGad_2,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1635.  
  1636.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1637.  
  1638.   TEXTGAD.ng_GadgetText   = "_Bottom";
  1639.  
  1640.   sprintf (String,"%+2.15Lf",IMIN);
  1641.  
  1642.   StringGad_4 = CreateGadget (STRING_KIND,StringGad_3,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1643.  
  1644.   TEXTGAD.ng_TopEdge     += (24 + TEXTGAD.ng_Height);
  1645.  
  1646.   TEXTGAD.ng_GadgetText   = "_Julia real";
  1647.  
  1648.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1649.  
  1650.   sprintf (String,"%+2.15Lf",JKRE);
  1651.  
  1652.   StringGad_5 = CreateGadget (STRING_KIND,StringGad_4,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1653.  
  1654.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1655.  
  1656.   TEXTGAD.ng_GadgetText   = "J_ulia imag";
  1657.  
  1658.   sprintf (String,"%+2.15Lf",JKIM);
  1659.  
  1660.   StringGad_6 = CreateGadget (STRING_KIND,StringGad_5,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1661.  
  1662.   CHECKBOXGAD.ng_LeftEdge   = 14;
  1663.  
  1664.   CHECKBOXGAD.ng_TopEdge    = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 24;
  1665.  
  1666.   CHECKBOXGAD.ng_Width      = MYFONTSTRUCT.ta_YSize << 1L;
  1667.  
  1668.   CHECKBOXGAD.ng_Height     = MYFONTSTRUCT.ta_YSize + 6;
  1669.  
  1670.   CHECKBOXGAD.ng_GadgetText = "_Keep X axis for ratio";
  1671.  
  1672.   CHECKBOXGAD.ng_Flags      = PLACETEXT_RIGHT;
  1673.  
  1674.   CHECKBOXGAD.ng_GadgetID   = KEEP;
  1675.  
  1676.   MyCheckBoxGad = CreateGadget (CHECKBOX_KIND,StringGad_6,&CHECKBOXGAD,GTCB_Checked,TRUE,GTCB_Scaled,TRUE,GT_Underscore,'_',TAG_END);
  1677.  
  1678.   BUTTONGAD.ng_LeftEdge   = 14;
  1679.  
  1680.   BUTTONGAD.ng_TopEdge    = CHECKBOXGAD.ng_TopEdge + CHECKBOXGAD.ng_Height + 30;
  1681.  
  1682.   BUTTONGAD.ng_Width      = 90;
  1683.  
  1684.   BUTTONGAD.ng_Height     = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  1685.  
  1686.   BUTTONGAD.ng_GadgetText = "_Accept";
  1687.  
  1688.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  1689.  
  1690.   MyButtonGad = CreateGadget (BUTTON_KIND,MyCheckBoxGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1691.  
  1692.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1693.  
  1694.   BUTTONGAD.ng_GadgetText = "Rat_io";
  1695.  
  1696.   BUTTONGAD.ng_GadgetID   = RATIO;
  1697.  
  1698.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1699.  
  1700.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1701.  
  1702.   BUTTONGAD.ng_GadgetText = "_Default";
  1703.  
  1704.   BUTTONGAD.ng_GadgetID   = RESET;
  1705.  
  1706.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1707.  
  1708.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1709.  
  1710.   BUTTONGAD.ng_GadgetText = "_Cancel";
  1711.  
  1712.   BUTTONGAD.ng_GadgetID   = CANCEL;
  1713.  
  1714.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1715.  
  1716.   if (MyButtonGad)
  1717.   {
  1718.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25,
  1719.                                    WA_Top,Win->TopEdge + 35,
  1720.                                    WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 24,
  1721.                                    WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35,
  1722.                                    WA_Title,"Coordinates requester",
  1723.                                    WA_ScreenTitle,"Insert new range...",
  1724.                                    WA_CustomScreen,Win->WScreen,
  1725.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|STRINGIDCMP|BUTTONIDCMP,
  1726.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  1727.                                    WA_Gadgets,GadList,
  1728.                                    TAG_END);
  1729.      if (GadWin)
  1730.      {
  1731.         GT_RefreshWindow (GadWin,NULL);
  1732.  
  1733.         do {  WaitPort (GadWin->UserPort);
  1734.  
  1735.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  1736.               {
  1737.                      MyGad = (struct Gadget *) Message->IAddress;
  1738.  
  1739.                      MyClass = Message->Class;
  1740.  
  1741.                      MyCode = Message->Code;
  1742.  
  1743.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  1744.  
  1745.                      switch (MyClass)
  1746.                      {
  1747.                             case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  1748.  
  1749.                                                        GT_EndRefresh (GadWin,TRUE);
  1750.  
  1751.                                                        break;
  1752.  
  1753.                             case IDCMP_VANILLAKEY    : switch (ToUpper ((ULONG) MyCode))
  1754.                                                        {
  1755.                                                               case 'L' : ActivateGadget (StringGad_1,GadWin,0);
  1756.  
  1757.                                                                          break;
  1758.  
  1759.                                                               case 'T' : ActivateGadget (StringGad_2,GadWin,0);
  1760.  
  1761.                                                                          break;
  1762.  
  1763.                                                               case 'R' : ActivateGadget (StringGad_3,GadWin,0);
  1764.  
  1765.                                                                          break;
  1766.  
  1767.                                                               case 'B' : ActivateGadget (StringGad_4,GadWin,0);
  1768.  
  1769.                                                                          break;
  1770.  
  1771.                                                               case 'J' : ActivateGadget (StringGad_5,GadWin,0);
  1772.  
  1773.                                                                          break;
  1774.  
  1775.                                                               case 'U' : ActivateGadget (StringGad_6,GadWin,0);
  1776.  
  1777.                                                                          break;
  1778.  
  1779.                                                               case 'A' : Accept = TRUE;
  1780.  
  1781.                                                                          break;
  1782.  
  1783.                                                               case 'I' : Ratio = TRUE;
  1784.  
  1785.                                                                          break;
  1786.  
  1787.                                                               case 'D' : Reset = TRUE;
  1788.  
  1789.                                                                          break;
  1790.  
  1791.                                                               case 'C' : Exit = TRUE;
  1792.  
  1793.                                                                          break;
  1794.  
  1795.                                                               case 'K' : KeepReal = ! KeepReal;
  1796.  
  1797.                                                                          GT_SetGadgetAttrs (MyCheckBoxGad,GadWin,NULL,GTCB_Checked,KeepReal,TAG_END);
  1798.  
  1799.                                                                          break;
  1800.  
  1801.                                                            case VAN_ESC: Exit = TRUE;
  1802.                                                        }
  1803.  
  1804.                                                                break;
  1805.  
  1806.                             case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  1807.                                                        {
  1808.                                                               case ACCEPT:   Accept = TRUE;
  1809.  
  1810.                                                                              break;
  1811.  
  1812.                                                               case  RATIO:   Ratio = TRUE;
  1813.  
  1814.                                                                              break;
  1815.  
  1816.                                                               case  RESET:   Reset = TRUE;
  1817.  
  1818.                                                                              break;
  1819.  
  1820.                                                               case   KEEP:   KeepReal = ! KeepReal;
  1821.  
  1822.                                                                              break;
  1823.  
  1824.                                                               case CANCEL:   Exit = TRUE;
  1825.                                                        }
  1826.  
  1827.                                                        break;
  1828.  
  1829.                             case IDCMP_CLOSEWINDOW   : Exit = TRUE;
  1830.                      }
  1831.  
  1832.                      if (Accept)
  1833.                      {
  1834.                         
  1835.                         sscanf (((struct StringInfo *) StringGad_1->SpecialInfo)->Buffer,"%Lf",&Tmp_RMIN);
  1836.  
  1837.                         sscanf (((struct StringInfo *) StringGad_2->SpecialInfo)->Buffer,"%Lf",&Tmp_IMAX);
  1838.  
  1839.                         sscanf (((struct StringInfo *) StringGad_3->SpecialInfo)->Buffer,"%Lf",&Tmp_RMAX);
  1840.  
  1841.                         sscanf (((struct StringInfo *) StringGad_4->SpecialInfo)->Buffer,"%Lf",&Tmp_IMIN);
  1842.  
  1843.                         sscanf (((struct StringInfo *) StringGad_5->SpecialInfo)->Buffer,"%Lf",&Tmp_JKRE);
  1844.  
  1845.                         sscanf (((struct StringInfo *) StringGad_6->SpecialInfo)->Buffer,"%Lf",&Tmp_JKIM);
  1846.  
  1847.                         if ((Tmp_RMIN >= Tmp_RMAX) || (Tmp_IMIN >= Tmp_IMAX)) DisplayBeep (Win->WScreen);
  1848.  
  1849.                         else
  1850.                         {
  1851.                            NewLimits = Exit = TRUE;
  1852.  
  1853.                            SaveCoords (Win,TRUE);
  1854.  
  1855.                            RMIN  = Tmp_RMIN;
  1856.  
  1857.                            IMAX  = Tmp_IMAX;
  1858.  
  1859.                            RMAX  = Tmp_RMAX;
  1860.  
  1861.                            IMIN  = Tmp_IMIN;
  1862.  
  1863.                            JKRE   = Tmp_JKRE;
  1864.  
  1865.                            JKIM   = Tmp_JKIM;
  1866.                         }
  1867.  
  1868.                         Accept = FALSE;
  1869.                      }
  1870.  
  1871.                      if (Ratio)
  1872.                      {
  1873.                         AdjustRatio (&Tmp_RMIN,&Tmp_IMAX,&Tmp_RMAX,&Tmp_IMIN,Win->Width,Win->Height,KeepReal);
  1874.  
  1875.                         TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  1876.  
  1877.                         sprintf (String,"%+2.15Lf",Tmp_RMIN);
  1878.  
  1879.                         GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  1880.  
  1881.                         sprintf (String,"%+2.15Lf",Tmp_IMAX);
  1882.  
  1883.                         GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  1884.  
  1885.                         sprintf (String,"%+2.15Lf",Tmp_RMAX);
  1886.  
  1887.                         TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  1888.  
  1889.                         GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  1890.  
  1891.                         sprintf (String,"%+2.15Lf",Tmp_IMIN);
  1892.  
  1893.                         GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  1894.  
  1895.                         Ratio = FALSE;
  1896.                      }
  1897.  
  1898.                      if (Reset)
  1899.                      {
  1900.                         TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  1901.  
  1902.                         sprintf (String,"%+2.15Lf",DEF_RMIN);
  1903.  
  1904.                         GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  1905.  
  1906.                         sprintf (String,"%+2.15Lf",DEF_IMAX);
  1907.  
  1908.                         GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  1909.  
  1910.                         TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  1911.  
  1912.                         sprintf (String,"%+2.15Lf",DEF_RMAX);
  1913.  
  1914.                         GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  1915.  
  1916.                         sprintf (String,"%+2.15Lf",DEF_IMIN);
  1917.  
  1918.                         GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  1919.  
  1920.                         sprintf (String,"%+2.15Lf",DEF_JKRE);
  1921.  
  1922.                         GT_SetGadgetAttrs (StringGad_5,GadWin,NULL,GTST_String,String,TAG_END);
  1923.  
  1924.                         sprintf (String,"%+2.15Lf",DEF_JKIM);
  1925.  
  1926.                         GT_SetGadgetAttrs (StringGad_6,GadWin,NULL,GTST_String,String,TAG_END);
  1927.  
  1928.                         Reset = FALSE;
  1929.                      }
  1930.               }
  1931.  
  1932.            } while (Exit == FALSE);
  1933.  
  1934.        CloseWindow (GadWin);
  1935.      }
  1936.  
  1937.      else Fail (WindowGadgetError,15L);
  1938.   }
  1939.  
  1940.   else Fail (GadgetError,15L);
  1941.  
  1942.   FreeGadgets (GadList);
  1943.  
  1944.   return NewLimits;
  1945. }
  1946.  
  1947. ULONG IntegerGad (struct Window *Win,TEXT *TitleWin,TEXT *TitleScr,TEXT *TxtString,ULONG Var)
  1948. {
  1949. struct IntuiMessage *Message;
  1950.  
  1951. struct Gadget *GadList = NULL,*MyIntGad,*MyButtonGad,*MyGad;
  1952.  
  1953. struct Window *GadWin;
  1954.  
  1955. BOOL Exit = FALSE;
  1956.  
  1957. UWORD MyCode;
  1958.  
  1959. ULONG MyClass;
  1960.  
  1961.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = VINFO;
  1962.  
  1963.   MyIntGad = CreateContext (&GadList);
  1964.  
  1965.   TEXTGAD.ng_LeftEdge     = 170;
  1966.  
  1967.   TEXTGAD.ng_TopEdge      = 20;
  1968.  
  1969.   TEXTGAD.ng_Width        = 90;
  1970.  
  1971.   TEXTGAD.ng_Height       = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  1972.  
  1973.   TEXTGAD.ng_GadgetText   = TxtString;
  1974.  
  1975.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1976.  
  1977.   MyIntGad = CreateGadget (INTEGER_KIND,MyIntGad,&TEXTGAD,GTIN_Number,Var,GTIN_MaxChars,6,STRINGA_ReplaceMode,TRUE,GT_Underscore,'_',TAG_END);
  1978.  
  1979.   BUTTONGAD.ng_LeftEdge   = 20;
  1980.  
  1981.   BUTTONGAD.ng_TopEdge    = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 30;
  1982.  
  1983.   BUTTONGAD.ng_Width      = 90;
  1984.  
  1985.   BUTTONGAD.ng_Height     = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  1986.  
  1987.   BUTTONGAD.ng_GadgetText = "_Accept";
  1988.  
  1989.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  1990.  
  1991.   MyButtonGad = CreateGadget (BUTTON_KIND,MyIntGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1992.  
  1993.   BUTTONGAD.ng_LeftEdge  += (60 + BUTTONGAD.ng_Width);
  1994.  
  1995.   BUTTONGAD.ng_GadgetText = "_Cancel";
  1996.  
  1997.   BUTTONGAD.ng_GadgetID   = CANCEL;
  1998.  
  1999.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  2000.  
  2001.   if (MyButtonGad)
  2002.   {
  2003.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25,
  2004.                                    WA_Top,Win->TopEdge + 35,
  2005.                                    WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 30,
  2006.                                    WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35,
  2007.                                    WA_Title,TitleWin,
  2008.                                    WA_ScreenTitle,TitleScr,
  2009.                                    WA_CustomScreen,Win->WScreen,
  2010.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|INTEGERIDCMP|BUTTONIDCMP,
  2011.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  2012.                                    WA_Gadgets,GadList,
  2013.                                    TAG_END);
  2014.  
  2015.      if (GadWin)
  2016.      {
  2017.         GT_RefreshWindow (GadWin,NULL);
  2018.  
  2019.         do {  WaitPort (GadWin->UserPort);
  2020.  
  2021.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  2022.               {
  2023.                      MyGad = (struct Gadget *) Message->IAddress;
  2024.  
  2025.                      MyClass = Message->Class;
  2026.  
  2027.                      MyCode = Message->Code;
  2028.  
  2029.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2030.  
  2031.                      switch (MyClass)
  2032.                      {
  2033.                             case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  2034.  
  2035.                                                        GT_EndRefresh (GadWin,TRUE);
  2036.  
  2037.                                                        break;
  2038.  
  2039.                             case IDCMP_VANILLAKEY    : switch (ToUpper ((ULONG) MyCode))
  2040.                                                        {
  2041.                                                               case 'D' :
  2042.  
  2043.                                                               case 'I' : ActivateGadget (MyIntGad,GadWin,0);
  2044.  
  2045.                                                                          break;
  2046.  
  2047.                                                               case 'A' : Var = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  2048.  
  2049.                                                                          Exit = TRUE;
  2050.  
  2051.                                                                          break;
  2052.  
  2053.                                                               case 'C' : Exit = TRUE;
  2054.  
  2055.                                                                          break;
  2056.  
  2057.                                                            case VAN_ESC: Exit = TRUE;
  2058.                                                        }
  2059.  
  2060.                                                        break;
  2061.  
  2062.                             case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  2063.                                                        {
  2064.                                                                case ACCEPT  : Var = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  2065.  
  2066.                                                                               Exit = TRUE;
  2067.  
  2068.                                                                               break;
  2069.  
  2070.                                                                case CANCEL  : Exit = TRUE;
  2071.                                                        }
  2072.  
  2073.                                                        break;
  2074.  
  2075.                             case IDCMP_CLOSEWINDOW   : Exit = TRUE;
  2076.                      }
  2077.               }
  2078.  
  2079.            } while (Exit == FALSE);
  2080.  
  2081.         CloseWindow (GadWin);
  2082.      }
  2083.  
  2084.      else Fail (WindowError,15L);
  2085.   }
  2086.  
  2087.   else Fail (GadgetError,15L);
  2088.  
  2089.   FreeGadgets (GadList);
  2090.  
  2091.   return Var;
  2092. }
  2093.  
  2094. void MVLine (struct RastPort *Rp,const LONG b1,const LONG b2,const LONG x)
  2095. {
  2096. REGISTER LONG y;
  2097.  
  2098. ULONG Color;
  2099.  
  2100.  CRE = RMIN + (((double)  x) * INCREMREAL);
  2101.  
  2102.  CIM = IMAX - (((double) b2) * INCREMIMAG);
  2103.  
  2104.  for (y = b2; y >= b1; y--)
  2105.  {
  2106.      Color = Mandel68k_FPU (MAX_ITERATIONS,CRE,CIM);
  2107.  
  2108.      if (Color)
  2109.      {
  2110.         Color *= CURRENT_MAX_COLORS,
  2111.  
  2112.         Color /= ITERATIONS,
  2113.  
  2114.         Color += RESERVED_PENS;
  2115.      }
  2116.  
  2117.      SetAPen (Rp,Color);
  2118.  
  2119.      WritePixel (Rp,x,y);
  2120.  
  2121.      CIM += INCREMIMAG;
  2122.  }
  2123. }
  2124.  
  2125. void MHLine (struct RastPort *Rp,const LONG a1,const LONG width,const LONG y)
  2126. {
  2127. REGISTER LONG x;
  2128.  
  2129. REGISTER UBYTE *TmpArray;
  2130.  
  2131. REGISTER ULONG Color;
  2132.  
  2133.  x = width;
  2134.  
  2135.  CRE = RMIN + (((double) a1) * INCREMREAL);
  2136.  
  2137.  TmpArray = PixelLine;
  2138.  
  2139.  CIM = IMAX - (((double)  y) * INCREMIMAG);
  2140.  
  2141.  while (x--)
  2142.  {
  2143.      Color = Mandel68k_FPU (MAX_ITERATIONS,CRE,CIM);
  2144.  
  2145.      if (Color)
  2146.      {
  2147.         Color *= CURRENT_MAX_COLORS,
  2148.  
  2149.         Color /= ITERATIONS,
  2150.  
  2151.         Color += RESERVED_PENS;
  2152.      }
  2153.  
  2154.      CRE += INCREMREAL;
  2155.  
  2156.      *TmpArray++ = Color;
  2157.  }
  2158.  
  2159.  WritePixelLine8 (Rp, a1, y, width, PixelLine, &TempRP);
  2160. }
  2161.  
  2162. void JVLine (struct RastPort *Rp,const LONG b1,const LONG b2,const LONG x)
  2163. {
  2164. REGISTER LONG y;
  2165.  
  2166. ULONG Color;
  2167.  
  2168.  CRE = RMIN + (((double)  x) * INCREMREAL);
  2169.  
  2170.  CIM = IMAX - (((double) b2) * INCREMIMAG);
  2171.  
  2172.  for (y = b2; y >= b1; y--)
  2173.  {
  2174.      Color = Julia68k_FPU (MAX_ITERATIONS,CRE,CIM,JKRE,JKIM);
  2175.  
  2176.      if (Color)
  2177.      {
  2178.         Color *= CURRENT_MAX_COLORS,
  2179.  
  2180.         Color /= ITERATIONS,
  2181.  
  2182.         Color += RESERVED_PENS;
  2183.      }
  2184.  
  2185.      SetAPen (Rp,Color);
  2186.  
  2187.      WritePixel (Rp,x,y);
  2188.  
  2189.      CIM += INCREMIMAG;
  2190.  }
  2191. }
  2192.  
  2193. void JHLine (struct RastPort *Rp,const LONG a1,const LONG width,const LONG y)
  2194. {
  2195. REGISTER LONG x = width;
  2196.  
  2197. UBYTE *TmpArray = PixelLine;
  2198.  
  2199. ULONG Color;
  2200.  
  2201.  CRE = RMIN + (((double) a1) * INCREMREAL);
  2202.  
  2203.  CIM = IMAX - (((double)  y) * INCREMIMAG);
  2204.  
  2205.  while (x--)
  2206.  {
  2207.      Color = Julia68k_FPU (MAX_ITERATIONS,CRE,CIM,JKRE,JKIM);
  2208.  
  2209.      if (Color)
  2210.      {
  2211.         Color *= CURRENT_MAX_COLORS,
  2212.  
  2213.         Color /= ITERATIONS,
  2214.  
  2215.         Color += RESERVED_PENS;
  2216.      }
  2217.      
  2218.      CRE += INCREMREAL;
  2219.  
  2220.      *TmpArray++ = Color;
  2221.  }
  2222.  
  2223.  WritePixelLine8 (Rp, a1, y, width, PixelLine, &TempRP);
  2224. }
  2225.  
  2226. BOOL CheckBox (struct RastPort *Rp,const LONG a1,const LONG b1,const LONG a2,const LONG b2)
  2227. {
  2228. const LONG Color = ReadPixel (Rp,a1,b1);
  2229.  
  2230. REGISTER LONG Var;
  2231.  
  2232.   if (Color != ReadPixel (Rp,a2,b2)) return FALSE;
  2233.  
  2234.   if (Color != ReadPixel (Rp,a2,b1)) return FALSE;
  2235.  
  2236.   if (Color != ReadPixel (Rp,a1,b2)) return FALSE;
  2237.  
  2238.   for (Var = (a1 + 1L); Var < a2; Var++)
  2239.   {
  2240.       if (Color != ReadPixel (Rp,Var,b1)) return FALSE;
  2241.  
  2242.       if (Color != ReadPixel (Rp,Var,b2)) return FALSE;
  2243.   }
  2244.  
  2245.   for (Var = (b1 + 1L); Var < b2; Var++)
  2246.   {
  2247.       if (Color != ReadPixel (Rp,a1,Var)) return FALSE;
  2248.  
  2249.       if (Color != ReadPixel (Rp,a2,Var)) return FALSE;
  2250.   }
  2251.  
  2252.   return TRUE;
  2253. }
  2254.  
  2255. BOOL RectangleDraw (struct Window *Win,const LONG a1,const LONG b1,const LONG a2,const LONG b2)
  2256. {
  2257. struct IntuiMessage *Message;
  2258.  
  2259. UWORD MyCode;
  2260.  
  2261. LONG helpx,helpy;
  2262.  
  2263. ULONG MyClass;
  2264.  
  2265.   if (Win->UserPort->mp_SigBit)
  2266.   {
  2267.      if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  2268.      {
  2269.         MyClass = Message->Class;
  2270.  
  2271.         MyCode  = Message->Code;
  2272.  
  2273.         GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2274.  
  2275.         switch (MyClass)
  2276.         {
  2277.           case IDCMP_MENUPICK    : if (MyCode != MENUNULL)
  2278.                                    {
  2279.                                       if (ProcessMenu (Win,MyCode) & STOP_MSG) return TRUE;
  2280.                                    }
  2281.  
  2282.                                    break;
  2283.  
  2284.           case IDCMP_RAWKEY      : if (MyCode == TAB)
  2285.                                    {
  2286.                                       DisplayBeep (Win->WScreen);
  2287.  
  2288.                                       Delay (30L);
  2289.  
  2290.                                       return FALSE;
  2291.                                    }
  2292.  
  2293.                                    if (MyCode == RAW_ESC)
  2294.                                    {
  2295.                                       DisplayBeep (Win->WScreen);
  2296.  
  2297.                                       return TRUE;
  2298.                                    }
  2299.  
  2300.                                    break;
  2301.  
  2302.           case IDCMP_CLOSEWINDOW : return TRUE;
  2303.         }
  2304.      }
  2305.   }
  2306.  
  2307.   helpx = a2 - a1;
  2308.  
  2309.   helpy = b2 - b1;
  2310.  
  2311.   if ((helpx < MINLIMIT) || (helpy < MINLIMIT)) return FALSE;
  2312.  
  2313.   if (CheckBox (Win->RPort,a1,b1,a2,b2))
  2314.   {
  2315.      SetAPen (Win->RPort,ReadPixel (Win->RPort,a1,b1));
  2316.  
  2317.      RectFill (Win->RPort,a1+1L,b1+1L,a2-1L,b2-1L);
  2318.  
  2319.      return FALSE;
  2320.   }
  2321.  
  2322.   if ((helpx < (MINLIMIT * 2L)) || (helpy < (MINLIMIT * 2L)))
  2323.   {
  2324.      for (helpx = (a1 + 1L); helpx < a2; helpx++)
  2325.      {
  2326.          (*V_LINE) (Win->RPort,b1+1L,b2-1L,helpx);
  2327.      }
  2328.  
  2329.      return FALSE;
  2330.   }
  2331.  
  2332.   if (helpx >= helpy)
  2333.   {
  2334.      helpx = (a1 + a2) >> 1L;
  2335.  
  2336.      (*V_LINE) (Win->RPort,b1+1L,b2-1L,helpx);
  2337.  
  2338.      if (RectangleDraw (Win,a1,b1,helpx,b2)) return TRUE;
  2339.  
  2340.      if (RectangleDraw (Win,helpx,b1,a2,b2)) return TRUE;
  2341.   }
  2342.  
  2343.   else
  2344.   {
  2345.      helpy = (b1 + b2) >> 1L;
  2346.  
  2347.      (*H_LINE) (Win->RPort,a1+1L,a2-a1-1,helpy);
  2348.  
  2349.      if (RectangleDraw (Win,a1,b1,a2,helpy)) return TRUE;
  2350.  
  2351.      if (RectangleDraw (Win,a1,helpy,a2,b2)) return TRUE;
  2352.   }
  2353.  
  2354.   return FALSE;
  2355. }
  2356.  
  2357. ULONG DrawFractal (struct Window *Win,const LONG a1,const LONG b1,const LONG a2,const LONG b2)
  2358. {
  2359. ULONG StartSec = NULL , EndSec = NULL , Dummy = NULL;
  2360.  
  2361.  CurrentTime (&StartSec,&Dummy);
  2362.  
  2363.  INCREMREAL = (fabs (RMAX-RMIN)) / ((double) (a2 - a1 + 1));
  2364.  
  2365.  INCREMIMAG = (fabs (IMAX-IMIN)) / ((double) (b2 - b1 + 1));
  2366.  
  2367.  ITERATIONS = MAX_ITERATIONS + 1;
  2368.  
  2369.  if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  2370.  
  2371.  (*H_LINE) (Win->RPort,a1,a2-a1+1,b1);
  2372.  
  2373.  (*V_LINE) (Win->RPort,b1+1,b2-1,a2);
  2374.  
  2375.  (*H_LINE) (Win->RPort,a1,a2-a1+1,b2);
  2376.  
  2377.  (*V_LINE) (Win->RPort,b1+1,b2-1,a1);
  2378.  
  2379.  RectangleDraw (Win,a1,b1,a2,b2);
  2380.  
  2381.  if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  2382.  
  2383.  CurrentTime (&EndSec,&Dummy);
  2384.  
  2385.  DisplayBeep (Win->WScreen);
  2386.  
  2387.  return (EndSec-StartSec);
  2388. }
  2389.  
  2390. BOOL Preview (struct Window *Win,WORD Width,WORD Height)
  2391. {
  2392. struct Window *PreviewWin;
  2393.  
  2394. struct IntuiMessage *Message;
  2395.  
  2396. BOOL Error = FALSE;
  2397.  
  2398. UWORD MyCode;
  2399.  
  2400. ULONG MyClass;
  2401.  
  2402.  MYBITMAP = CopyBitMap (Win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2403.  
  2404.  PreviewWin = OpenWindowTags (0,WA_Left,Win->LeftEdge + 25,
  2405.                                 WA_Top,Win->TopEdge + 35,
  2406.                                 WA_Width,(WORD) (Width  >> 1L),
  2407.                                 WA_Height,(WORD) (Height >> 1L),
  2408.                                 WA_Title,"Preview window",
  2409.                                 WA_ScreenTitle,"¼ Window preview...",
  2410.                                 WA_CustomScreen,Win->WScreen,
  2411.                                 WA_IDCMP,IDCMP_RAWKEY|IDCMP_CLOSEWINDOW,
  2412.                                 WA_Flags,WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_NOCAREREFRESH|WFLG_SMART_REFRESH|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
  2413.                                 WA_BusyPointer,TRUE,
  2414.                                 TAG_END);
  2415.  if (PreviewWin)
  2416.  {
  2417.     PasteBitMap (MYBITMAP,PreviewWin,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2418.  
  2419.     PutPointer (PreviewWin,0,0,0,0,0,BUSY_POINTER);
  2420.  
  2421.     ELAPSEDTIME = DrawFractal (PreviewWin,0L,0L,(LONG) (PreviewWin->GZZWidth) - 1L,(LONG) (PreviewWin->GZZHeight) - 1L);
  2422.  
  2423.     PutPointer (PreviewWin,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  2424.  
  2425.     ShowTime (Win,"Preview elapsed time:",ELAPSEDTIME);
  2426.  
  2427.     while (1L)
  2428.     {
  2429.          WaitPort (PreviewWin->UserPort);
  2430.  
  2431.          if (Message = (struct IntuiMessage *) GT_GetIMsg (PreviewWin->UserPort))
  2432.          {
  2433.             MyClass = Message->Class;
  2434.  
  2435.             MyCode  = Message->Code;
  2436.  
  2437.             GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2438.  
  2439.             if (MyClass == IDCMP_CLOSEWINDOW) break;
  2440.  
  2441.             if ((MyClass == IDCMP_RAWKEY) && (MyCode == RAW_ESC)) break;
  2442.          }
  2443.     }
  2444.  
  2445.     PutPointer (PreviewWin,0,0,0,0,0,CLEAR_POINTER);
  2446.  
  2447.     CloseWindow (PreviewWin);
  2448.  }
  2449.  
  2450.  else
  2451.  {
  2452.     if (BMASK & MASK)
  2453.     {
  2454.        FreeBitMapSafety (MYBITMAP);
  2455.  
  2456.        MASK ^= BMASK;
  2457.     }
  2458.  
  2459.     Fail (PreviewWindowError,15L);
  2460.  
  2461.     Error = TRUE;
  2462.  }
  2463.  
  2464.  return Error;
  2465. }
  2466.  
  2467. BOOL DrawFrame (struct Window *Win,WORD Zx,WORD Zy,WORD Zw,WORD Zh)
  2468. {
  2469. WORD LeftEdge,TopEdge,RightEdge,BottomEdge;
  2470.  
  2471.   if ((Zx > 2) && (Zy > 2) && (Zx < Win->Width - 2) && (Zy < Win->Height - 2) && ((Zw >= INITIALZOOM) || (Zh >= INITIALZOOM)))
  2472.   {
  2473.      LeftEdge   = Zx - Zw;
  2474.  
  2475.      TopEdge    = Zy - Zh;
  2476.  
  2477.      RightEdge  = Zx + Zw;
  2478.  
  2479.      BottomEdge = Zy + Zh;
  2480.  
  2481.      if ((LeftEdge >= 0) && (TopEdge >= 0) && (RightEdge <= Win->Width) && (BottomEdge <= Win->Height))
  2482.      {
  2483.         ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge;
  2484.  
  2485.         ZOOMLINE [1] = ZOOMLINE [3] = ZOOMLINE [9] = TopEdge;
  2486.  
  2487.         ZOOMLINE [2] = ZOOMLINE [4] = RightEdge;
  2488.  
  2489.         ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge;
  2490.      }
  2491.  
  2492.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2493.  
  2494.      MASK |= ZMASK;
  2495.   }
  2496.  
  2497.   else MASK ^= ZMASK;
  2498.  
  2499.   return (BOOL) (ZMASK & MASK);
  2500. }
  2501.  
  2502. BOOL FileRequest (struct Window *Win,TEXT *String,TEXT *DrawerTxt,BOOL DrawerType,BOOL Save)
  2503. {
  2504. struct FileRequester *MyFileReq;
  2505.  
  2506. static struct EasyStruct MyReq = { sizeof (struct EasyStruct),0,"Overwrite file requester","File already exists...\n\nDo you want overwrite it ?","Yes|No" };
  2507.  
  2508. BPTR MyLock;
  2509.  
  2510. BOOL Success = FALSE;
  2511.  
  2512.   if (MyFileReq = AllocAslRequest (ASL_FileRequest,0))
  2513.   {
  2514.      MYDIR = (DrawerType ? PALETTESDIR : PICTURESDIR);
  2515.  
  2516.      if (! strlen (MYDIR)) strcpy (MYDIR,DrawerTxt);
  2517.  
  2518.      if (AslRequestTags (MyFileReq,ASLFR_Window,Win,
  2519.                                    ASLFR_InitialLeftEdge,Win->LeftEdge + 25,
  2520.                                    ASLFR_InitialTopEdge,Win->TopEdge + 35,
  2521.                                    ASLFR_InitialWidth,300,
  2522.                                    ASLFR_InitialHeight,((Win->Height) * 7) >> 3,
  2523.                                    ASLFR_SleepWindow,TRUE,
  2524.                                    ASLFR_TextAttr,&MYFONTSTRUCT,
  2525.                                    ASLFR_TitleText,String,
  2526.                                    ASLFR_InitialDrawer,MYDIR,
  2527.                                    ASLFR_InitialFile,MYFILE,
  2528.                                    ASLFR_DoSaveMode,Save,
  2529.                                    ASLFR_RejectIcons,TRUE,
  2530.                                    TAG_END))
  2531.      {
  2532.         strcpy (MYFILE,MyFileReq->rf_File);
  2533.  
  2534.         strcpy (MYDIR,MyFileReq->rf_Dir);
  2535.  
  2536.         strcpy (MYPATH,MYDIR);
  2537.  
  2538.         Success = AddPart (MYPATH,MYFILE,sizeof (MYPATH));
  2539.      }
  2540.  
  2541.      FreeAslRequest (MyFileReq);
  2542.  
  2543.      if (Save)
  2544.      {
  2545.         if (MyLock = Lock (MYPATH,ACCESS_READ))
  2546.         {
  2547.            UnLock (MyLock);
  2548.  
  2549.            if (! EasyRequest (Win,&MyReq,0)) Success = FALSE;
  2550.         }
  2551.      }
  2552.   }
  2553.  
  2554.   return Success;
  2555. }
  2556.  
  2557. BOOL FontRequest (struct Window *Win)
  2558. {
  2559. struct FontRequester *MyFontReq;
  2560.  
  2561. BOOL Success = FALSE;
  2562.  
  2563.   if (MyFontReq = AllocAslRequest (ASL_FontRequest,0))
  2564.   {
  2565.      if (AslRequestTags (MyFontReq,ASLFO_Window,Win,
  2566.                                    ASLFO_InitialLeftEdge,Win->LeftEdge + 25,
  2567.                                    ASLFO_InitialTopEdge,Win->TopEdge + 35,
  2568.                                    ASLFO_InitialWidth,300,
  2569.                                    ASLFO_InitialHeight,((Win->Height) * 7) >> 3,
  2570.                                    ASLFO_SleepWindow,TRUE,
  2571.                                    ASLFO_TextAttr,&MYFONTSTRUCT,
  2572.                                    ASLFO_TitleText,"Font requester",
  2573.                                    ASLFO_InitialName,MYFONTSTRUCT.ta_Name,
  2574.                                    ASLFO_InitialSize,MYFONTSTRUCT.ta_YSize,
  2575.                                    ASLFO_InitialStyle,MYFONTSTRUCT.ta_Style,
  2576.                                    ASLFO_InitialFlags,MYFONTSTRUCT.ta_Flags,
  2577.                                    ASLFO_DoFrontPen,TRUE,
  2578.                                    ASLFO_DoBackPen,TRUE,
  2579.                                    ASLFO_DoStyle,TRUE,
  2580.                                    ASLFO_DoDrawMode,TRUE,
  2581.                                    ASLFO_MinHeight,8,
  2582.                                    ASLFO_MaxHeight,24,
  2583.                                    TAG_END))
  2584.      {
  2585.        strcpy (MYFONTSTRUCT.ta_Name,MyFontReq->fo_Attr.ta_Name);
  2586.  
  2587.        MYFONTSTRUCT.ta_YSize = MyFontReq->fo_Attr.ta_YSize;
  2588.  
  2589.        MYFONTSTRUCT.ta_Style = MyFontReq->fo_Attr.ta_Style;
  2590.  
  2591.        MYFONTSTRUCT.ta_Flags = MyFontReq->fo_Attr.ta_Flags;
  2592.  
  2593.        Success = TRUE;
  2594.      }
  2595.  
  2596.      FreeAslRequest (MyFontReq);
  2597.   }
  2598.  
  2599.   return Success;
  2600. }
  2601.  
  2602. static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *Hook),REG (a2,struct ScreenModeRequester *SMReq),REG (a1,ULONG DisplayID))
  2603. {
  2604. DisplayInfoHandle DisplayHandle;
  2605.  
  2606. struct DisplayInfo DisplayInfo;
  2607.  
  2608. struct DimensionInfo DimensionInfo;
  2609.  
  2610. ULONG Accept = NULL;
  2611.  
  2612.   DisplayHandle = FindDisplayInfo (DisplayID);
  2613.  
  2614.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,DisplayID))
  2615.   {
  2616.      if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,DisplayID))
  2617.      {
  2618.         Accept = (ULONG) ((DimensionInfo.MaxDepth <= MAX_DEPTH) && (DisplayInfo.PropertyFlags & DIPF_IS_WB));
  2619.      }
  2620.   }
  2621.  
  2622.   return Accept;
  2623. }
  2624.  
  2625. BOOL SMRequest (struct ILBMInfo *Ilbm)
  2626. {
  2627. struct ScreenModeRequester *SMReq;
  2628.  
  2629. struct Window *Win = Ilbm->win;
  2630.  
  2631. BOOL NewScreen = FALSE;
  2632.  
  2633.  if (SMReq = AllocAslRequest (ASL_ScreenModeRequest,NULL))
  2634.  {
  2635.     if (AslRequestTags (SMReq,ASLSM_Window,Win,
  2636.                               ASLSM_SleepWindow,TRUE,
  2637.                               ASLSM_TitleText,"ScreenMode requester",
  2638.                               ASLSM_InitialLeftEdge,Win->LeftEdge + 25,
  2639.                               ASLSM_InitialTopEdge,Win->TopEdge + 35,
  2640.                               ASLSM_InitialWidth,310,
  2641.                               ASLSM_InitialHeight,((Win->Height) * 7) >> 3,
  2642.                               ASLSM_InitialDisplayID,GetVPModeID (Ilbm->vp),
  2643.                               ASLSM_InitialDisplayWidth,Win->Width,
  2644.                               ASLSM_InitialDisplayHeight,Win->Height,
  2645.                               ASLSM_InitialDisplayDepth,Ilbm->wrp->BitMap->Depth,
  2646.                               ASLSM_InitialOverscanType,Ilbm->ucliptype,
  2647.                               ASLSM_InitialInfoOpened,TRUE,
  2648.                               ASLSM_InitialInfoLeftEdge,Win->LeftEdge + 310 + 15,
  2649.                               ASLSM_InitialInfoTopEdge,Win->TopEdge,
  2650.                               ASLSM_DoWidth,TRUE,
  2651.                               ASLSM_DoHeight,TRUE,
  2652.                               ASLSM_DoDepth,TRUE,
  2653.                               ASLSM_DoOverscanType,TRUE,
  2654.                               ASLSM_MinDepth,MIN_DEPTH,
  2655.                               ASLSM_MaxDepth,MAX_DEPTH,
  2656.                               ASLSM_PropertyFlags,DIPF_IS_WB,
  2657.                               ASLSM_PropertyMask,DIPF_IS_DUALPF|DIPF_IS_PF2PRI|DIPF_IS_HAM|DIPF_IS_EXTRAHALFBRITE,
  2658.                               ASLSM_FilterFunc,&SMFILTERHOOK,
  2659.                               ASLSM_MinWidth,MIN_WIDTH,
  2660.                               ASLSM_MinHeight,MIN_HEIGHT,
  2661.                               TAG_END))
  2662.     {
  2663.        Ilbm->camg = SMReq->sm_DisplayID;
  2664.  
  2665.        Ilbm->Bmhd.w = SMReq->sm_DisplayWidth;
  2666.  
  2667.        Ilbm->Bmhd.h = SMReq->sm_DisplayHeight;
  2668.  
  2669.        Ilbm->Bmhd.nPlanes = SMReq->sm_DisplayDepth;
  2670.  
  2671.        Ilbm->ucliptype = SMReq->sm_OverscanType;
  2672.  
  2673.        NewScreen = TRUE;
  2674.     }
  2675.  
  2676.     FreeAslRequest (SMReq);
  2677.  }
  2678.  
  2679.  return NewScreen;
  2680. }
  2681.  
  2682. VOID SetMenuStart (struct Window *Win)
  2683. {
  2684.   OnMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  2685.  
  2686.   OnMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  2687.  
  2688.   OnMenu  (Win,FULLMENUNUM (0,3,NOSUB));
  2689.  
  2690.   OnMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  2691.  
  2692.   OnMenu  (Win,FULLMENUNUM (0,5,NOSUB));
  2693.  
  2694.   OnMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  2695.  
  2696.   OnMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  2697.  
  2698.   OnMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  2699.  
  2700.   OnMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  2701.  
  2702.   OnMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  2703.  
  2704.   OnMenu  (Win,FULLMENUNUM (1,4,NOSUB));
  2705.  
  2706.   OnMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  2707.  
  2708. /*  OnMenu  (Win,FULLMENUNUM (2,4,NOSUB)); */
  2709.  
  2710.   OffMenu (Win,FULLMENUNUM (2,7,NOSUB));
  2711.  
  2712.   OnMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  2713.  
  2714.   OnMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  2715.  
  2716.   OnMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  2717.  
  2718.   OnMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  2719. }
  2720.  
  2721. VOID SetMenuStop (struct Window *Win)
  2722. {
  2723.   OffMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  2724.  
  2725.   OffMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  2726.  
  2727.   OffMenu  (Win,FULLMENUNUM (0,3,NOSUB));
  2728.  
  2729.   OffMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  2730.  
  2731.   OffMenu  (Win,FULLMENUNUM (0,5,NOSUB));
  2732.  
  2733.   OffMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  2734.  
  2735.   OffMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  2736.  
  2737.   OffMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  2738.  
  2739.   OffMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  2740.  
  2741.   OffMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  2742.  
  2743.   OffMenu  (Win,FULLMENUNUM (1,4,NOSUB));
  2744.  
  2745.   OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  2746.  
  2747.   OffMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  2748.  
  2749. /*  OffMenu  (Win,FULLMENUNUM (2,4,NOSUB)); */
  2750.  
  2751.   OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  2752.  
  2753.   OnMenu   (Win,FULLMENUNUM (2,7,NOSUB));
  2754.  
  2755.   OffMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  2756.  
  2757.   OffMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  2758.  
  2759.   OffMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  2760.  
  2761.   OffMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  2762. }
  2763.  
  2764. ULONG ProcessMenu (struct Window *Win,UWORD Code)
  2765. {
  2766. struct MenuItem *Item;
  2767.  
  2768. ULONG Choice = NULL;
  2769.  
  2770.  while (Code != MENUNULL)
  2771.  {
  2772.   Item = ItemAddress (MAINMENU,(ULONG) Code);
  2773.  
  2774.   switch (MENUNUM (Code))
  2775.   {
  2776.         case 0:    switch (ITEMNUM (Code))
  2777.                    {
  2778.                         case 0: Choice |= ABOUT_MSG;
  2779.  
  2780.                                 break;
  2781.  
  2782.                         case 2: Choice |= LOADPICTURE_MSG;
  2783.  
  2784.                                 break;
  2785.  
  2786.                         case 3: Choice |= SAVEPICTURE_MSG;
  2787.  
  2788.                                 break;
  2789.  
  2790.                         case 4: Choice |= LOADPALETTE_MSG;
  2791.  
  2792.                                 break;
  2793.  
  2794.                         case 5: Choice |= SAVEPALETTE_MSG;
  2795.  
  2796.                                 break;
  2797.  
  2798.                         case 7: Choice |= DUMP_MSG;
  2799.  
  2800.                                 break;
  2801.  
  2802.                         case 9: Choice |= EXIT_MSG;
  2803.  
  2804.                                 break;
  2805.                    }
  2806.  
  2807.                    break;
  2808.  
  2809.         case 1:    switch (ITEMNUM (Code))
  2810.                    {
  2811.                         case 0: switch (SUBNUM (Code))
  2812.                                 {
  2813.                                    case 0: Choice |= TITLE_MSG;
  2814.  
  2815.                                            break;
  2816.  
  2817.                                    case 2: Choice |= TIME_MSG;
  2818.  
  2819.                                            break;
  2820.                                 }
  2821.  
  2822.                                 break;
  2823.  
  2824.                         case 1: Choice |= COORDS_MSG;
  2825.  
  2826.                                 break;
  2827.  
  2828.                         case 2: switch (SUBNUM (Code))
  2829.                                 {
  2830.                                    case 0: MAX_ITERATIONS = 63;
  2831.  
  2832.                                            break;
  2833.  
  2834.                                    case 1: MAX_ITERATIONS = 127;
  2835.  
  2836.                                            break;
  2837.  
  2838.                                    case 2: MAX_ITERATIONS = 191;
  2839.  
  2840.                                            break;
  2841.  
  2842.                                    case 3: MAX_ITERATIONS = 255;
  2843.  
  2844.                                            break;
  2845.  
  2846.                                    case 4: MAX_ITERATIONS = 319;
  2847.  
  2848.                                            break;
  2849.  
  2850.                                    case 5: MAX_ITERATIONS = 383;
  2851.  
  2852.                                            break;
  2853.  
  2854.                                    case 6: MAX_ITERATIONS = 447;
  2855.  
  2856.                                            break;
  2857.  
  2858.                                    case 7: MAX_ITERATIONS = 511;
  2859.  
  2860.                                            break;
  2861.  
  2862.                                    case 8: MAX_ITERATIONS = 1023;
  2863.  
  2864.                                            break;
  2865.  
  2866.                                   case 10: Choice |= ITER_MSG;
  2867.  
  2868.                                            break;
  2869.                                 }
  2870.  
  2871.                                 break;
  2872.  
  2873.                         case 3: switch (SUBNUM (Code))
  2874.                                 {
  2875.                                    case  0: PRIORITY = -5;
  2876.  
  2877.                                             break;
  2878.  
  2879.                                    case  1: PRIORITY = -4;
  2880.  
  2881.                                             break;
  2882.  
  2883.                                    case  2: PRIORITY = -3;
  2884.  
  2885.                                             break;
  2886.  
  2887.                                    case  3: PRIORITY = -2;
  2888.  
  2889.                                             break;
  2890.  
  2891.                                    case  4: PRIORITY = -1;
  2892.  
  2893.                                             break;
  2894.  
  2895.                                    case  6: PRIORITY =  0;
  2896.  
  2897.                                             break;
  2898.  
  2899.                                    case  8: PRIORITY =  1;
  2900.  
  2901.                                             break;
  2902.  
  2903.                                    case  9: PRIORITY =  2;
  2904.  
  2905.                                             break;
  2906.  
  2907.                                    case 10: PRIORITY =  3;
  2908.  
  2909.                                             break;
  2910.  
  2911.                                    case 11: PRIORITY =  4;
  2912.  
  2913.                                             break;
  2914.  
  2915.                                    case 12: PRIORITY =  5;
  2916.  
  2917.                                             break;
  2918.  
  2919.                                 }
  2920.  
  2921.                                 Forbid ();
  2922.  
  2923.                                 THISTASK = FindTask (NULL);
  2924.  
  2925.                                 Permit ();
  2926.  
  2927.                                 SetTaskPri (THISTASK,PRIORITY);
  2928.  
  2929.                                 break;
  2930.  
  2931.                         case 4: switch (SUBNUM (Code))
  2932.                                 {
  2933.                                    case 0: if (H_LINE != JHLine)
  2934.                                            {
  2935.                                               PickJuliaK (Win);
  2936.  
  2937.                                               H_LINE = JHLine;
  2938.  
  2939.                                               V_LINE = JVLine;
  2940.  
  2941.                                               JULIA = TRUE;
  2942.  
  2943.                                               SetWindowTitles (Win,(TEXT *) ~0,"Julia constant selected");
  2944.  
  2945.                                               Choice |= REDRAW_MSG;
  2946.  
  2947.                                               DisplayBeep (Win->WScreen);
  2948.  
  2949.                                               Delay (ONESEC);
  2950.                                            }
  2951.  
  2952.                                            break;
  2953.  
  2954.                                    case 1: if (H_LINE != MHLine)
  2955.                                            {
  2956.                                               SaveCoords (Win,TRUE);
  2957.  
  2958.                                               RMIN = DEF_RMIN;
  2959.  
  2960.                                               RMAX = DEF_RMAX;
  2961.  
  2962.                                               IMIN = DEF_IMIN;
  2963.  
  2964.                                               IMAX = DEF_IMAX;
  2965.  
  2966.                                               H_LINE = MHLine;
  2967.  
  2968.                                               V_LINE = MVLine;
  2969.  
  2970.                                               JULIA = FALSE;
  2971.  
  2972.                                               Choice |= REDRAW_MSG;
  2973.                                            }
  2974.  
  2975.                                            break;
  2976.                                 }
  2977.  
  2978.                                 break;
  2979.                    }
  2980.  
  2981.                    break;
  2982.  
  2983.         case 2: switch (ITEMNUM (Code))
  2984.                 {
  2985.                    case 0: Choice |= PREVIEW_MSG;
  2986.  
  2987.                            break;
  2988.  
  2989.                    case 2: Choice |= REDRAW_MSG;
  2990.  
  2991.                            break;
  2992.  
  2993.                    case 4: Choice |= UNDO_MSG | REDRAW_MSG;
  2994.  
  2995.                            break;
  2996.  
  2997.                    case 6: Choice |= DRAW_MSG;
  2998.  
  2999.                            break;
  3000.  
  3001.                    case 7: Choice |= STOP_MSG;
  3002.  
  3003.                            break;
  3004.                 }
  3005.  
  3006.                 break;
  3007.  
  3008.         case 3: switch (ITEMNUM (Code))
  3009.                 {
  3010.                    case 0: switch (SUBNUM (Code))
  3011.                            {
  3012.                               case 0: Choice |= CYCLERIGHT_MSG;
  3013.  
  3014.                                       break;
  3015.  
  3016.                               case 1: Choice |= CYCLELEFT_MSG;
  3017.  
  3018.                                       break;
  3019.  
  3020.                               case 3: Choice |= DELAY_MSG;
  3021.  
  3022.                                       break;
  3023.  
  3024.                            }
  3025.  
  3026.                            break;
  3027.  
  3028.                    case 2: Choice |= PALETTE_MSG;
  3029.  
  3030.                            break;
  3031.  
  3032.                    case 4: Choice |= NEWDISPLAY_MSG;
  3033.  
  3034.                            break;
  3035.  
  3036.                    case 6: Choice |= FONTREQ_MSG;
  3037.  
  3038.                            break;
  3039.                 }
  3040.   }
  3041.  
  3042.  Code = Item->NextSelect;
  3043.  }
  3044.  
  3045.  return Choice;
  3046. }
  3047.  
  3048. VOID ProcessMouse (struct Window *Win,WORD CurMouseX,WORD CurMouseY)
  3049. {
  3050. static WORD MX1 = 0 , MY1 = 0 , MX2 = 0 , MY2 = 0, W = 0, H = 0;
  3051.  
  3052. struct IntuiMessage *Message;
  3053.  
  3054. UWORD MyCode;
  3055.  
  3056. LONG DefaultQueue;
  3057.  
  3058. ULONG MyClass;
  3059.  
  3060.    ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE);
  3061.  
  3062.    DefaultQueue = SetMouseQueue (Win,10);
  3063.  
  3064.    if (ZMASK & MASK) DrawFrame (Win,MX1,MY1,W,H);
  3065.  
  3066.    MX1 = CurMouseX;
  3067.  
  3068.    MY1 = CurMouseY;
  3069.  
  3070.    W = INITIALZOOM;
  3071.  
  3072.    H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width);
  3073.  
  3074.    DrawFrame (Win,MX1,MY1,W,H);
  3075.  
  3076.    while (1L)
  3077.    {
  3078.      WaitPort (Win->UserPort);
  3079.  
  3080.      if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  3081.      {
  3082.         MyClass = Message->Class;
  3083.  
  3084.         MyCode = Message->Code;
  3085.  
  3086.         MX2 = Message->MouseX;
  3087.  
  3088.         MY2 = Message->MouseY;
  3089.  
  3090.         GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3091.  
  3092.         if (MyClass == IDCMP_MOUSEMOVE)
  3093.         {
  3094.            DrawFrame (Win,MX1,MY1,W,H);
  3095.  
  3096.            W = abs (MX1 - MX2);
  3097.  
  3098.            H = abs (MY1 - MY2);
  3099.  
  3100.            if (W > H) (W = ScalerDiv ((LONG) H,(ULONG) Win->Width,(ULONG) Win->Height));
  3101.  
  3102.            else (H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width));
  3103.  
  3104.            DrawFrame (Win,MX1,MY1,W,H);
  3105.         }
  3106.  
  3107.         else if ((MyClass == IDCMP_MOUSEBUTTONS) && (MyCode != SELECTDOWN)) break;
  3108.      }
  3109.    }
  3110.  
  3111.    SetMouseQueue (Win,(ULONG) DefaultQueue);
  3112.  
  3113.    ModifyIDCMP (Win,IDCMP_STANDARD);
  3114.  
  3115.    if (ZMASK & MASK)
  3116.    {
  3117.       OnMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  3118.  
  3119.       OnMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  3120.    }
  3121.  
  3122.    else
  3123.    {
  3124.       OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  3125.  
  3126.       OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  3127.    }
  3128. }
  3129.  
  3130. void PickJuliaK (struct Window *Win)
  3131. {
  3132. struct IntuiMessage *Message;
  3133.  
  3134. BOOL Selected = FALSE;
  3135.  
  3136. WORD MouseX = 0,MouseY = 0;
  3137.  
  3138. UWORD MyCode = 0;
  3139.  
  3140. ULONG MyClass = NULL;
  3141.  
  3142. double RealCoord=0.0,ImagCoord=0.0;
  3143.  
  3144.  SetWindowTitles (Win,(TEXT *) ~0,"Press left button to choose the Julia constant");
  3145.  
  3146.  do { WaitPort (Win->UserPort);
  3147.  
  3148.       if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  3149.       {
  3150.              MyClass = Message->Class;
  3151.  
  3152.              MyCode  = Message->Code;
  3153.  
  3154.              MouseX  = Message->MouseX;
  3155.  
  3156.              MouseY  = Message->MouseY;
  3157.  
  3158.              GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3159.       }
  3160.  
  3161.       switch (MyClass)
  3162.       {
  3163.              case    IDCMP_MOUSEMOVE: if (TMASK & MASK)
  3164.                                       {
  3165.                                          RealCoord = RMIN + ((DOUBLE) MouseX * fabs (RMAX-RMIN) / (DOUBLE) (Win->Width - 1));
  3166.  
  3167.                                          ImagCoord = IMAX - ((DOUBLE) MouseY * fabs (IMAX-IMIN) / (DOUBLE) (Win->Height - 1));
  3168.  
  3169.                                          sprintf (BAR_STRING,"Julia constant: Real %+2.15Lf Imag %+2.15Lfi",RealCoord,ImagCoord);
  3170.  
  3171.                                          WaitTOF ();
  3172.  
  3173.                                          SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING);
  3174.                                       }
  3175.  
  3176.                                       break;
  3177.  
  3178.              case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN)
  3179.                                       {
  3180.                                          JKRE = RealCoord;
  3181.  
  3182.                                          JKIM = ImagCoord;
  3183.  
  3184.                                          Selected = TRUE;
  3185.                                       }
  3186.  
  3187.                                       break;
  3188.       }
  3189.  
  3190.     } while (Selected != TRUE);
  3191. }
  3192.  
  3193. ULONG HandleEvents (struct ILBMInfo *Ilbm)
  3194. {
  3195. struct IntuiMessage *Message;
  3196.  
  3197. WORD MouseX = 0,MouseY = 0;
  3198.  
  3199. UWORD MyCode = 0;
  3200.  
  3201. LONG Error;
  3202.  
  3203. ULONG MyClass = NULL,MyMenu = NULL,Index;
  3204.  
  3205. double RealCoord,ImagCoord,ScrRatio,FracRatio;
  3206.  
  3207.  PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3208.  
  3209.  do { WaitPort (Ilbm->win->UserPort);
  3210.  
  3211.       if (Message = (struct IntuiMessage *) GT_GetIMsg (Ilbm->win->UserPort))
  3212.       {
  3213.              MyClass = Message->Class;
  3214.  
  3215.              MyCode  = Message->Code;
  3216.  
  3217.              MouseX  = Message->MouseX;
  3218.  
  3219.              MouseY  = Message->MouseY;
  3220.  
  3221.              GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3222.       }
  3223.  
  3224.       switch (MyClass)
  3225.       {
  3226.              case    IDCMP_MOUSEMOVE: if (TMASK & MASK)
  3227.                                       {
  3228.                                          RealCoord = RMIN + ((DOUBLE) MouseX * fabs (RMAX-RMIN) / (DOUBLE) (Ilbm->win->Width - 1));
  3229.  
  3230.                                          ImagCoord = IMAX - ((DOUBLE) MouseY * fabs (IMAX-IMIN) / (DOUBLE) (Ilbm->win->Height - 1));
  3231.  
  3232.                                          ScrRatio  = (DOUBLE) Ilbm->win->Width / (DOUBLE) Ilbm->win->Height;
  3233.  
  3234.                                          FracRatio = fabs (RMAX-RMIN) / fabs (IMAX-IMIN);
  3235.  
  3236.                                          sprintf (BAR_STRING,"Real %#+2.15Lf Imag %#+2.15Lfi W:H %.3Lf R:I %.3Lf",RealCoord,ImagCoord,ScrRatio,FracRatio);
  3237.  
  3238.                                          WaitTOF ();
  3239.  
  3240.                                          SetWindowTitles (Ilbm->win,(TEXT *) ~0,BAR_STRING);
  3241.                                       }
  3242.  
  3243.                                       break;
  3244.  
  3245.              case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN) ProcessMouse (Ilbm->win,MouseX,MouseY);
  3246.  
  3247.                                       break;
  3248.  
  3249.              case     IDCMP_MENUPICK: MyMenu = ProcessMenu (Ilbm->win,MyCode);
  3250.  
  3251.                                       if (MyMenu & EXIT_MSG) break;
  3252.  
  3253.                                       if (MyMenu & TITLE_MSG)
  3254.                                       {
  3255.                                          if (TMASK & MASK) MASK ^= TMASK;
  3256.  
  3257.                                          else MASK |= TMASK;
  3258.  
  3259.                                          Ilbm->TBState = TMASK & MASK;
  3260.  
  3261.                                          ShowTitle (Ilbm->scr,(LONG) Ilbm->TBState);
  3262.  
  3263.                                          break;
  3264.                                       }
  3265.  
  3266.                                       if (MyMenu & TIME_MSG)
  3267.                                       {
  3268.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,TRUE);
  3269.  
  3270.                                          ShowTime (Ilbm->win,"Last calculating time:",ELAPSEDTIME);
  3271.  
  3272.                                          Delay (TWOSECS);
  3273.  
  3274.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,FALSE);
  3275.  
  3276.                                          break;
  3277.                                       }
  3278.  
  3279.                                       if (MyMenu & ITER_MSG)
  3280.                                       {
  3281.                                          ModifyIDCMP (Ilbm->win,NULL);
  3282.  
  3283.                                          ClearMenuStrip (Ilbm->win);
  3284.  
  3285.                                          while (1L)
  3286.                                          {
  3287.                                             MAX_ITERATIONS = (WORD) IntegerGad (Ilbm->win,"Iterations requester","Insert new iterations...","_Iterations",MAX_ITERATIONS + 1L) - 1L;
  3288.  
  3289.                                             if (MAX_ITERATIONS >= MIN_ITERATIONS) break;
  3290.  
  3291.                                             DisplayBeep (Ilbm->scr);
  3292.  
  3293.                                             MAX_ITERATIONS = MIN_ITERATIONS;
  3294.                                          }
  3295.  
  3296.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3297.  
  3298.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3299.  
  3300.                                          break;
  3301.                                       }
  3302.  
  3303.                                       if (MyMenu & ABOUT_MSG)
  3304.                                       {
  3305.                                          ModifyIDCMP (Ilbm->win,NULL);
  3306.  
  3307.                                          ClearMenuStrip (Ilbm->win);
  3308.  
  3309.                                          About (Ilbm->win);
  3310.  
  3311.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3312.  
  3313.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3314.  
  3315.                                          break;
  3316.                                       }
  3317.  
  3318.                                       if (MyMenu & PALETTE_MSG)
  3319.                                       {
  3320.                                          ModifyIDCMP (Ilbm->win,NULL);
  3321.  
  3322.                                          ClearMenuStrip (Ilbm->win);
  3323.  
  3324.                                          if (! ModifyPalette (Ilbm->win,Ilbm->win->LeftEdge + 25,Ilbm->win->TopEdge + 35,PALETTE)) Fail (PaletteRequesterError,15L);
  3325.  
  3326.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3327.  
  3328.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3329.  
  3330.                                          break;
  3331.                                       }
  3332.  
  3333.                                       if (MyMenu & CYCLERIGHT_MSG)
  3334.                                       {
  3335.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  3336.  
  3337.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3338.  
  3339.                                          ClearMenuStrip (Ilbm->win);
  3340.  
  3341.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3342.  
  3343.                                          Cycle (Ilbm->win,DELAY,SHIFTRIGHT);
  3344.  
  3345.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3346.  
  3347.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3348.  
  3349.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3350.  
  3351.                                          LoadRGB32 (Ilbm->vp,PALETTE);
  3352.  
  3353.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3354.  
  3355.                                          break;
  3356.                                       }
  3357.  
  3358.                                       if (MyMenu & CYCLELEFT_MSG)
  3359.                                       {
  3360.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  3361.  
  3362.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3363.  
  3364.                                          ClearMenuStrip (Ilbm->win);
  3365.  
  3366.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3367.  
  3368.                                          Cycle (Ilbm->win,DELAY,SHIFTLEFT);
  3369.  
  3370.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3371.  
  3372.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3373.  
  3374.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3375.  
  3376.                                          LoadRGB32 (Ilbm->vp,PALETTE);
  3377.  
  3378.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3379.  
  3380.                                          break;
  3381.                                       }
  3382.  
  3383.                                       if (MyMenu & DELAY_MSG)
  3384.                                       {
  3385.                                          while (1L)
  3386.                                          {
  3387.                                             DELAY = IntegerGad (Ilbm->win,"Delay requester","Insert delay time...","_Delay time",DELAY);
  3388.  
  3389.                                             if ((DELAY >= 0L) && (DELAY <= 100)) break;
  3390.  
  3391.                                             DisplayBeep (Ilbm->scr);
  3392.                                          }
  3393.  
  3394.                                          break;
  3395.                                       }
  3396.  
  3397.                                       if (MyMenu & STOP_MSG)
  3398.                                       {
  3399.                                          SetMenuStart (Ilbm->win);
  3400.  
  3401.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3402.  
  3403.                                          break;
  3404.                                       }
  3405.  
  3406.                                       if (MyMenu & LOADPICTURE_MSG)
  3407.                                       {
  3408.                                          if (FileRequest (Ilbm->win,"Load iff picture","PROGDIR:Pictures",PICTURES_DRAWER,FALSE))
  3409.                                          {
  3410.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3411.  
  3412.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3413.                                             {
  3414.                                                if (! (Error = QueryMandPic (Ilbm,&MANDChunkTmp,MYPATH)))
  3415.                                                {
  3416.                                                   MANDChunk = *MANDChunkTmp;
  3417.  
  3418.                                                   SaveCoords (Ilbm->win,TRUE);
  3419.  
  3420.                                                   RMIN = MANDChunk.RMin;
  3421.  
  3422.                                                   RMAX = MANDChunk.RMax;
  3423.  
  3424.                                                   IMIN = MANDChunk.IMin;
  3425.  
  3426.                                                   IMAX = MANDChunk.IMax;
  3427.  
  3428.                                                   JKRE  = MANDChunk.RConst;
  3429.  
  3430.                                                   JKIM  = MANDChunk.IConst;
  3431.  
  3432.                                                   if (MANDChunk.Special & JULIA_BIT) JULIA = TRUE;
  3433.  
  3434.                                                   else JULIA = FALSE;
  3435.  
  3436.                                                   MAX_ITERATIONS = MANDChunk.Iterations - 1L;
  3437.  
  3438.                                                   Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  3439.  
  3440.                                                   CloseDisplay (Ilbm,VINFO);
  3441.  
  3442.                                                   Ilbm->IFFPFlags = IFFPF_BESTFIT;
  3443.  
  3444.                                                   CURRENT_MAX_COLORS = MakeDisplay (Ilbm);
  3445.  
  3446.                                                   Ilbm->IFFPFlags = NULL;
  3447.  
  3448.                                                   if (! CURRENT_MAX_COLORS)
  3449.                                                   {
  3450.                                                      Fail (MakeDisplayError,20L);
  3451.  
  3452.                                                      MyMenu = EXIT_MSG;
  3453.  
  3454.                                                      break;
  3455.                                                   }
  3456.  
  3457.                                                   if (ZMASK & MASK) MASK ^= ZMASK;
  3458.  
  3459.                                                   CURRENT_MAX_COLORS -= RESERVED_PENS;
  3460.  
  3461.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3462.  
  3463.                                                   if (LoadMandPic (Ilbm,MYPATH)) Fail (LoadMandPicError,5L);
  3464.  
  3465.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3466.  
  3467.                                                   GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L);
  3468.  
  3469.                                                   ClearMenuStrip (Ilbm->win);
  3470.  
  3471.                                                   if (JULIA)
  3472.                                                   {
  3473.                                                      if (ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags ^= CHECKED;
  3474.  
  3475.                                                      if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED;
  3476.  
  3477.                                                      H_LINE = JHLine;
  3478.  
  3479.                                                      V_LINE = JVLine;
  3480.                                                   }
  3481.  
  3482.                                                   else
  3483.                                                   {
  3484.                                                      if (ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags ^= CHECKED;
  3485.  
  3486.                                                      if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED;
  3487.  
  3488.                                                      H_LINE = MHLine;
  3489.  
  3490.                                                      V_LINE = MVLine;
  3491.                                                   }
  3492.  
  3493.                                                   for (Index = 0; Index <= 10; Index++) if (ItemAddress (MAINMENU,FULLMENUNUM (1,2,Index))->Flags & CHECKED) ItemAddress (MAINMENU,FULLMENUNUM (1,2,Index))->Flags ^= CHECKED;
  3494.  
  3495.                                                   switch (MAX_ITERATIONS)
  3496.                                                   {
  3497.                                                     case 63 :  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  3498.  
  3499.                                                                break;
  3500.  
  3501.                                                     case 127:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags |= CHECKED;
  3502.  
  3503.                                                                break;
  3504.  
  3505.                                                     case 191:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,2))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,2))->Flags |= CHECKED;
  3506.  
  3507.                                                                break;
  3508.  
  3509.                                                     case 255:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,3))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,3))->Flags |= CHECKED;
  3510.  
  3511.                                                                break;
  3512.  
  3513.                                                     case 319:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags |= CHECKED;
  3514.  
  3515.                                                                break;
  3516.  
  3517.                                                     case 383:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,5))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,5))->Flags |= CHECKED;
  3518.  
  3519.                                                                break;
  3520.  
  3521.                                                     case 447:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,6))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,6))->Flags |= CHECKED;
  3522.  
  3523.                                                                break;
  3524.  
  3525.                                                     case 511:  if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,7))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,7))->Flags |= CHECKED;
  3526.  
  3527.                                                                break;
  3528.  
  3529.                                                     case 1023: if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,8))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,8))->Flags |= CHECKED;
  3530.  
  3531.                                                                break;
  3532.  
  3533.                                                     default:   if (! (ItemAddress (MAINMENU,FULLMENUNUM (1,2,10))->Flags & CHECKED)) ItemAddress (MAINMENU,FULLMENUNUM (1,2,10))->Flags |= CHECKED;
  3534.  
  3535.                                                                break;
  3536.                                                   }
  3537.  
  3538.                                                   ResetMenuStrip (Ilbm->win,MAINMENU);
  3539.                                                }
  3540.  
  3541.                                                else Fail (QueryMandPicError,NULL);
  3542.  
  3543.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3544.                                             }
  3545.                                          }
  3546.  
  3547.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3548.  
  3549.                                          break;
  3550.                                       }
  3551.  
  3552.                                       if (MyMenu & SAVEPICTURE_MSG)
  3553.                                       {
  3554.                                          if (FileRequest (Ilbm->win,"Save iff picture","PROGDIR:Pictures",PICTURES_DRAWER,TRUE))
  3555.                                          {
  3556.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3557.  
  3558.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3559.                                             {
  3560.                                                MANDChunk.LeftEdge = Ilbm->win->LeftEdge;
  3561.  
  3562.                                                MANDChunk.TopEdge = Ilbm->win->TopEdge;
  3563.  
  3564.                                                MANDChunk.Width = Ilbm->win->Width;
  3565.  
  3566.                                                MANDChunk.Height = Ilbm->win->Height;
  3567.  
  3568.                                                MANDChunk.RMin = RMIN;
  3569.  
  3570.                                                MANDChunk.RMax = RMAX;
  3571.  
  3572.                                                MANDChunk.IMin = IMIN;
  3573.  
  3574.                                                MANDChunk.IMax = IMAX;
  3575.  
  3576.                                                MANDChunk.RConst = JKRE;
  3577.  
  3578.                                                MANDChunk.IConst = JKIM;
  3579.  
  3580.                                                MANDChunk.Iterations = MAX_ITERATIONS + 1L;
  3581.  
  3582.                                                MANDChunk.Special = (REAL_BIT | SPREAD_BIT);
  3583.  
  3584.                                                if (JULIA == TRUE) MANDChunk.Special |= JULIA_BIT;
  3585.  
  3586.                                                if (ZMASK & MASK)
  3587.                                                {
  3588.                                                   DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3589.  
  3590.                                                   MASK ^= ZMASK;
  3591.                                                }
  3592.  
  3593.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3594.  
  3595.                                                if (SaveMandPic (Ilbm,&SPECIAL_CHUNK,©RIGHT_CHUNK,MYPATH)) Fail (SaveMandPicError,5L);
  3596.  
  3597.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3598.  
  3599.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3600.                                             }
  3601.                                          }
  3602.  
  3603.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3604.  
  3605.                                          break;
  3606.                                       }
  3607.  
  3608.                                       if (MyMenu & LOADPALETTE_MSG)
  3609.                                       {
  3610.                                          if (FileRequest (Ilbm->win,"Load palette","PROGDIR:Palettes",PALETTES_DRAWER,FALSE))
  3611.                                          {
  3612.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3613.  
  3614.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3615.                                             {
  3616.                                                if (LoadPalette (Ilbm,MYPATH)) Fail (LoadMandPalError,5L);
  3617.  
  3618.                                                GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L);
  3619.  
  3620.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3621.                                             }
  3622.  
  3623.                                             else Fail (NoMem,5L);
  3624.                                          }
  3625.  
  3626.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3627.  
  3628.                                          break;
  3629.                                       }
  3630.  
  3631.                                       if (MyMenu & SAVEPALETTE_MSG)
  3632.                                       {
  3633.                                          if (FileRequest (Ilbm->win,"Save palette","PROGDIR:Palettes",PALETTES_DRAWER,TRUE))
  3634.                                          {
  3635.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3636.  
  3637.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3638.                                             {
  3639.                                                if (SavePalette (Ilbm,©RIGHT_CHUNK,MYPATH)) Fail (LoadMandPalError,5L);
  3640.  
  3641.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3642.                                             }
  3643.  
  3644.                                             else Fail (NoMem,5L);
  3645.                                          }
  3646.  
  3647.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3648.  
  3649.                                          break;
  3650.                                       }
  3651.  
  3652.                                       if (MyMenu & FONTREQ_MSG)
  3653.                                       {
  3654.                                          if (FontRequest (Ilbm->win))
  3655.                                          {
  3656.                                             if (ZMASK & MASK)
  3657.                                             {
  3658.                                                DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3659.  
  3660.                                                MASK ^= ZMASK;
  3661.                                             }
  3662.  
  3663.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3664.  
  3665.                                             MYBITMAP = CopyBitMap (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height);
  3666.  
  3667.                                             Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  3668.  
  3669.                                             CloseDisplay (Ilbm,VINFO);
  3670.  
  3671.                                             if (! MakeDisplay (Ilbm))
  3672.                                             {
  3673.                                                Fail (MakeDisplayError,20L);
  3674.  
  3675.                                                MyMenu = EXIT_MSG;
  3676.  
  3677.                                                break;
  3678.                                             }
  3679.  
  3680.                                             PasteBitMap (MYBITMAP,Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  3681.                                          }
  3682.  
  3683.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3684.  
  3685.                                          break;
  3686.                                       }
  3687.  
  3688.                                       if (MyMenu & DUMP_MSG)
  3689.                                       {
  3690.                                          ModifyIDCMP (Ilbm->win,NULL);
  3691.  
  3692.                                          ClearMenuStrip (Ilbm->win);
  3693.  
  3694.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3695.  
  3696.                                          if (Choice (Ilbm->win,"Print requester","Are you sure ?"))
  3697.                                          {
  3698.                                             WinDump (Ilbm->win);
  3699.                                          }
  3700.  
  3701.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3702.  
  3703.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3704.  
  3705.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3706.  
  3707.                                          break;
  3708.                                       }
  3709.  
  3710.                                       if (MyMenu & PREVIEW_MSG)
  3711.                                       {
  3712.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  3713.                                          {
  3714.                                             ModifyIDCMP (Ilbm->win,NULL);
  3715.  
  3716.                                             ClearMenuStrip (Ilbm->win);
  3717.  
  3718.                                             Preview (Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  3719.  
  3720.                                             ResetMenuStrip (Ilbm->win,MAINMENU);
  3721.  
  3722.                                             ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3723.  
  3724.                                             RestoreCoords (Ilbm->win);
  3725.                                          }
  3726.  
  3727.                                          break;
  3728.                                       }
  3729.  
  3730.                                       if (MyMenu & COORDS_MSG)
  3731.                                       {
  3732.                                          ModifyIDCMP (Ilbm->win,NULL);
  3733.  
  3734.                                          ClearMenuStrip (Ilbm->win);
  3735.  
  3736.                                          if (ShowCoords (Ilbm->win))
  3737.                                          {
  3738.                                             if (Choice (Ilbm->win,"Rendering requester","Recalculate ?")) MyMenu |= REDRAW_MSG;
  3739.                                          }
  3740.  
  3741.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3742.  
  3743.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3744.                                       }
  3745.  
  3746.                                       if (MyMenu & UNDO_MSG) RestoreCoords (Ilbm->win);
  3747.  
  3748.                                       if (MyMenu & REDRAW_MSG)
  3749.                                       {
  3750.                                          if (ZMASK & MASK)
  3751.                                          {
  3752.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3753.  
  3754.                                             MASK ^= ZMASK;
  3755.                                          }
  3756.  
  3757.                                          SetMenuStop (Ilbm->win);
  3758.  
  3759.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3760.  
  3761.                                          ELAPSEDTIME = DrawFractal (Ilbm->win,(LONG) (Ilbm->win->LeftEdge),(LONG) (Ilbm->win->TopEdge),(LONG) (Ilbm->win->Width) - 1L,(LONG) (Ilbm->win->Height) - 1L);
  3762.  
  3763.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3764.  
  3765.                                          SetMenuStart (Ilbm->win);
  3766.  
  3767.                                          ShowTime (Ilbm->win,"Recalculate elapsed time:",ELAPSEDTIME);
  3768.  
  3769.                                          break;
  3770.                                       }
  3771.  
  3772.                                       if (MyMenu & DRAW_MSG)
  3773.                                       {
  3774.                                          if (ZMASK & MASK)
  3775.                                          {
  3776.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3777.  
  3778.                                             MASK ^= ZMASK;
  3779.                                          }
  3780.  
  3781.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  3782.                                          {
  3783.                                             MYBITMAP = CopyBitMap (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  3784.  
  3785.                                             PasteBitMap (MYBITMAP,Ilbm->win,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  3786.  
  3787.                                             SetMenuStop (Ilbm->win);
  3788.  
  3789.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3790.  
  3791.                                             ELAPSEDTIME = DrawFractal (Ilbm->win,(LONG) (Ilbm->win->LeftEdge),(LONG) (Ilbm->win->TopEdge),(LONG) (Ilbm->win->Width) - 1L,(LONG) (Ilbm->win->Height) - 1L);
  3792.  
  3793.                                             PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3794.  
  3795.                                             SetMenuStart (Ilbm->win);
  3796.  
  3797.                                             ShowTime (Ilbm->win,"Zoom elapsed time:",ELAPSEDTIME);
  3798.                                          }
  3799.  
  3800.                                          break;
  3801.                                       }
  3802.  
  3803.                                       break;
  3804.  
  3805.              case       IDCMP_RAWKEY: if (MyCode == RAW_ESC) MyMenu = EXIT_MSG;
  3806.  
  3807.                                       break;
  3808.  
  3809.              case  IDCMP_CLOSEWINDOW: MyMenu = EXIT_MSG;
  3810.       }
  3811.  
  3812.     } while (! ((MyMenu & EXIT_MSG) || (MyMenu & NEWDISPLAY_MSG)));
  3813.  
  3814.  return MyMenu;
  3815. }
  3816.  
  3817. void FreeBitMapSafety (struct BitMap *Bitmap)
  3818. {
  3819.     WaitBlit ();
  3820.  
  3821.     FreeBitMap (Bitmap);
  3822. }
  3823.  
  3824. struct BitMap *CopyBitMap (struct Window *Win,WORD Left,WORD Top,WORD Width,WORD Height)
  3825. {
  3826. struct BitMap *NewBM;
  3827.  
  3828.   NewBM = AllocBitMap ((ULONG) Width,(ULONG) Height,(ULONG) Win->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES,Win->RPort->BitMap);
  3829.  
  3830.   if (NewBM)
  3831.   {
  3832.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  3833.  
  3834.      if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  3835.  
  3836.      BltBitMap (Win->RPort->BitMap,Left,Top,NewBM,0,0,Width,Height,0xC0,0xFF,NULL);
  3837.  
  3838.      if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  3839.  
  3840.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  3841.  
  3842.      MASK |= BMASK;
  3843.   }
  3844.  
  3845.   return NewBM;
  3846. }
  3847.  
  3848. BOOL PasteBitMap (struct BitMap *SrcBM,struct Window *DstWin,WORD SrcWidth,WORD SrcHeight)
  3849. {
  3850. BOOL Success = FALSE;
  3851.  
  3852. UWORD DstWinWidth,DstWinHeight;
  3853.  
  3854. struct BitMap *TmpBM;
  3855.  
  3856.   if (SrcBM)
  3857.   {
  3858.      DstWinWidth = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZWidth : DstWin->Width);
  3859.  
  3860.      DstWinHeight = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZHeight : DstWin->Height);
  3861.  
  3862.      TmpBM = AllocBitMap ((ULONG) DstWinWidth,(ULONG) DstWinHeight,(ULONG) DstWin->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_MINPLANES | BMF_CLEAR,DstWin->RPort->BitMap);
  3863.  
  3864.      if (TmpBM)
  3865.      {
  3866.         BSA.bsa_SrcWidth    = SrcWidth;
  3867.         BSA.bsa_SrcHeight   = SrcHeight;
  3868.         BSA.bsa_XSrcFactor  = SrcWidth;
  3869.         BSA.bsa_YSrcFactor  = SrcHeight;
  3870.         BSA.bsa_XDestFactor = DstWinWidth;
  3871.         BSA.bsa_YDestFactor = DstWinHeight;
  3872.         BSA.bsa_SrcBitMap   = SrcBM;
  3873.         BSA.bsa_DestBitMap  = TmpBM;
  3874.  
  3875.         BitMapScale (&BSA);
  3876.  
  3877.         BltBitMapRastPort (TmpBM,0,0,DstWin->RPort,0,0,DstWinWidth,DstWinHeight,0xC0);
  3878.  
  3879.         FreeBitMapSafety (TmpBM);
  3880.  
  3881.         Success = TRUE;
  3882.      }
  3883.  
  3884.      FreeBitMapSafety (SrcBM);
  3885.  
  3886.      MASK ^= BMASK;
  3887.   }
  3888.  
  3889.   return Success;
  3890. }
  3891.  
  3892. LONG WinDump (struct Window *Win)
  3893. {
  3894. struct IODRPReq *IODrp;
  3895. struct MsgPort  *PrinterPort;
  3896. struct ViewPort *Vp;
  3897.  
  3898. LONG Error = PDERR_BADDIMENSION;
  3899.  
  3900.   if (! Win) return Error;
  3901.  
  3902.   if (PrinterPort = CreatePort (0,0))
  3903.   {
  3904.      if (IODrp = (struct IODRPReq *) CreateExtIO (PrinterPort,sizeof (struct IODRPReq)))
  3905.      {
  3906.         if (! (Error = OpenDevice ("printer.device",0,(struct IORequest *) IODrp,0)))
  3907.         {
  3908.            Vp = ViewPortAddress (Win);
  3909.  
  3910.            IODrp->io_Command   = PRD_DUMPRPORT;
  3911.            IODrp->io_RastPort  = Win->RPort;
  3912.            IODrp->io_ColorMap  = Vp->ColorMap;
  3913.            IODrp->io_Modes     = (ULONG) Vp->Modes;
  3914.            IODrp->io_SrcX      = Win->LeftEdge;
  3915.            IODrp->io_SrcY      = Win->TopEdge;
  3916.            IODrp->io_SrcWidth  = Win->Width;
  3917.            IODrp->io_SrcHeight = Win->Height;
  3918.            IODrp->io_DestCols  = 0;
  3919.            IODrp->io_Special   = SPECIAL_FULLCOLS | SPECIAL_ASPECT;
  3920.  
  3921.            Error = DoIO ((struct IORequest *)IODrp);
  3922.  
  3923.            CloseDevice ((struct IORequest *)IODrp);
  3924.         }
  3925.  
  3926.         DeleteExtIO ((struct IORequest *)IODrp);
  3927.      }
  3928.  
  3929.      DeletePort (PrinterPort);
  3930.   }
  3931.  
  3932.   return Error;
  3933. }
  3934.